2014-12-22 18 views
11

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

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 
}; 
+0

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

+0

@Cynic Evet, işte tam olarak böyle. Cevabını buna göre düzenledim. – Angew

+0

'Şablon void foo (F (int) intCallable) {...} ':/ – jaskmar

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çekte
template <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 FTypeReturnType(ArgTypes...) olmanın bir ihtisas olurdu, bunu çağırmak çalışırsanız uyumlu bir şekilde.