Je cherchais à Ne Clugston de FastDelegate mini-bibliothèque et a remarqué un étrange syntaxique truc avec la structure suivante:
TemplateClass< void( int, int ) > Object;
Il semble presque comme si une signature de fonction est utilisé comme un argument pour un modèle de déclaration.
Cette technique (dont la présence dans FastDelegate est apparemment due à un Jody Hagins) a été utilisé pour simplifier la déclaration des instances de modèle avec un semi-nombre arbitraire de paramètres du modèle.
À savoir, il a permis à ce quelque chose comme ce qui suit:
// 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;
En dépit de la vraie bouffée de hackiness, je trouve ce genre de spoofy émulation de variadic template arguments assez hallucinant.
La vraie viande de cette astuce semble être le fait que je peux passer textuelle des constructions comme "Type1(Type2, Type3)" comme des arguments de modèles. Voici donc mes questions: Comment fonctionne exactement le compilateur interpréter cette construction? Est-ce une signature de fonction? Ou, est-il un modèle de texte avec des parenthèses-t-il? Dans le premier cas, alors est ce que cela implique que toute fonction arbitraire de signature est un type valide jusqu'au modèle de processeur est concerné?
Une question de suivi serait que, depuis l'exemple de code ci-dessus est valable de code, pourquoi ne pas le C++ standard vous permet tout simplement de faire quelque chose comme ce qui suit, qui ne compile pas?
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;