que je recherchais au mini-bibliothèque de Don Clugston FastDelegate et remarqué un truc syntactique bizarre avec la structure suivante:fonction des expressions semblables à des signatures que les arguments de modèle de C
TemplateClass< void(int, int) > Object;
Il apparaît presque comme si une signature de fonction est en cours utilisé en tant qu'argument à une déclaration d'instance de modèle.
Cette technique (dont la présence dans FastDelegate est apparemment due à un Jody Hagins) a été utilisée pour simplifier la déclaration des instances de modèle avec un nombre semi-arbitraire de paramètres de modèle.
À savoir, il a permis à cette 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;
Malgré la véritable bouffée d'hackiness, je trouve ce genre d'émulation spoofy des arguments de modèle variadique être assez hallucinant.
Le vrai truc de cette astuce semble être le fait que je peux passer des constructions textuelles comme "Type1 (Type2, Type3)" comme arguments aux templates. Alors voici mes questions: Comment exactement le compilateur interprète-t-il cette construction? Est-ce une signature de fonction? Ou, est-ce juste un modèle de texte avec des parenthèses dedans? Si le premier, alors cela implique que toute signature de fonction arbitraire est un type valide en ce qui concerne le processeur de modèle?
Une question de suivi serait que, puisque l'exemple de code ci-dessus est un code valide, pourquoi la norme C++ ne vous permet-elle pas 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;
+1, excellente question et je suis un grand fan de la bibliothèque en question. –
Voir le paragraphe "Types de fonctions C++ en tant que DSL" de [cet article] (http://cpp-next.com/archive/2010/11/expressive-c-fun-with-function-composition/) – icecrime
Pour une autre manière pour émuler des arguments de modèles variés, voir http://templog.svn.sourceforge.net/viewvc/templog/code/trunk/tuples.h?revision=47&view=markup – sbi