böyle std :: işlevini örneğini parantez içine alınmış argümanları kabul edecek std :: function-like şablonunun nasıl yazılacağı ile ilgili herhangi bir makale bulmak. Herkes sözdizimini ve sınırlamalarını açıklayabilir mi, yoksa en azından mevcut bir açıklamaya işaret edebilir mi?C++ std :: fonksiyon benzeri şablon sözdizimi
11
A
cevap
14
Bu konuda özel bir şey yok, sıradan bir işlev türü. Böyle bir işlev bildirmek zaman:
int foo(char a, double b)
Sonra onun tip int (char, double)
olduğunu. Bireysel argüman türlerini ve dönüş tipini "unwrapping" etmenin bir yolu kısmi şablon uzmanlığını kullanmaktır. int(std::string, std::string)
sadece bir tür olduğu için, hemen hemen herhangi bir başka şablon gibi
template <class T>
struct function; // not defined
template <class R, class... A>
struct function<R (A...)>
{
// definition here
};
3
: Temelde, std::function
şuna benzer.
İşte derler gerçekten naif örnek: benim naif bir örnek zaten size ihtiyacınız doğrulama verecektir olsa
Gerçektetemplate <typename FType>
struct Functor
{
Functor(FType* fptr) : fptr(fptr) {}
template <typename ...Args>
void call(Args... args)
{
fptr(args...);
}
private:
FType* fptr;
};
void foo(int x, char y, bool z) {}
int main()
{
Functor<void(int, char, bool)> f(&foo);
f.call(1, 'a', true);
//f.call(); // error: too few arguments to function
}
Eğer FType
ReturnType(ArgTypes...)
olmanın bir ihtisas olurdu, bunu çağırmak çalışırsanız uyumlu bir şekilde.
Yani, doğru bir şekilde anlarsam, int (char, double) tek bir işlev türü olarak yorumlanır, ancak sonra kısmi uzmanlık ile dönüş tipi ve parametre listesi ayıklayabiliriz? – Smiles
@Cynic Evet, işte tam olarak böyle. Cevabını buna göre düzenledim. – Angew
'Şablon void foo (F (int) intCallable) {...} ':/ –
jaskmar