I looked at the Don Clugston FastDelegate mini library and noticed a strange syntax trick with the following structure:
TemplateClass< void( int, int ) > Object;
It looks like the function signature is used as an argument to declare an instance of the template.
This method (whose presence in FastDelegate is apparently due to one Jody Hagins) was used to simplify the declaration of template instances with a semi-arbitrary number of template parameters.
In particular, this allowed us to do the following:
// 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;
Despite the real smell of hacking, I find that such a fake emulation of the template's variational arguments is quite captivating.
The real meat of this trick seems to be the fact that I can pass text constructs like "Type1 (Type2, Type3)" as template arguments. So, here are my questions: how exactly does the compiler interpret this construct? Is this a function signature? Or is it just a text template with parentheses? If the former, then does this mean that any arbitrary function signature is a valid type with respect to the template processor?
The next question will be that, since the above code example is valid code, why the C ++ standard does not allow you to do something like the following that does not compile?
template<typename _T1> struct Object { _T1 m_member1; };