stavo guardando di don Clugston FastDelegate mini-biblioteca e ho notato un trucco sintattica strano con la seguente struttura:funzione di firma, come espressioni come C++ argomenti template
TemplateClass< void(int, int) > Object;
Sembra quasi come se una firma di funzione è in corso utilizzato come argomento per una dichiarazione di istanza del modello.
Questa tecnica (la cui presenza in FastDelegate è apparentemente dovuta a un Jody Hagins) è stata utilizzata per semplificare la dichiarazione delle istanze del modello con un numero semi-arbitrario di parametri del modello.
Vale a dire, ha permesso questo qualcosa di simile al seguente:
// A template with one parameter
template<typename _T1>
struct Object1
{
_T1 m_member1;
};
// A template with two parameters
template<typename _T1, typename _T2>
struct Object2
{
_T1 m_member1;
_T2 m_member2;
};
// A forward declaration
template<typename _Signature>
struct Object;
// Some derived types using "function signature"-style template parameters
template<typename _Dummy, typename _T1>
struct Object<_Dummy(_T1)> : public Object1<_T1> {};
template<typename _Dummy, typename _T1, typename _T2>
struct Object<_Dummy(_T1, _T2)> : public Object2<_T1, _T2> {};
// A. "Vanilla" object declarations
Object1<int> IntObjectA;
Object2<int, char> IntCharObjectA;
// B. Nifty, but equivalent, object declarations
typedef void UnusedType;
Object< UnusedType(int) > IntObjectB;
Object< UnusedType(int, char) > IntCharObjectB;
// C. Even niftier, and still equivalent, object declarations
#define DeclareObject(...) Object< UnusedType(__VA_ARGS__) >
DeclareObject(int) IntObjectC;
DeclareObject(int, char) IntCharObjectC;
Nonostante il vero soffio di hackiness, trovo questo tipo di emulazione Spoofy di argomenti template variadic di essere abbastanza sconvolgente.
La vera carne di questo trucco sembra essere il fatto che posso passare costrutti testuali come "Tipo1 (Tipo2, Tipo3)" come argomenti ai modelli. Quindi ecco le mie domande: in che modo esattamente il compilatore interpreta questo costrutto? È una firma di funzione? Oppure, è solo un modello di testo con parentesi in esso? Se il primo, allora implica che qualsiasi firma di funzione arbitraria è un tipo valido per quanto riguarda il processore di template?
Una domanda successiva è che, poiché il codice sopra riportato è un codice valido, perché lo standard C++ non consente solo di fare qualcosa di simile al seguente, che non viene compilato?
template<typename _T1>
struct Object
{
_T1 m_member1;
};
// Note the class identifier is also "Object"
template<typename _T1, typename _T2>
struct Object
{
_T1 m_member1;
_T2 m_member2;
};
Object<int> IntObject;
Object<int, char> IntCharObject;
+1, ottima domanda e sono un grande fan della biblioteca in questione. –
Vedere il paragrafo "Tipi di funzione C++ come DSL" di [questo articolo] (http://cpp-next.com/archive/2010/11/expressive-c-fun-with-function-composition/) – icecrime
Per un altro modo per emulare gli argomenti dei modelli variadic vedere http://templog.svn.sourceforge.net/viewvc/templog/code/trunk/tuples.h?revision=47&view=markup – sbi