подпись-как функция выражения с аргументами шаблона

fastdelegate

я смотрел на мини-библиотека не clugston и заметил странный синтаксический трюк со следующей структурой:

templateclass< void( int, int ) > object;

это почти кажется, как если бы подпись функция используется в качестве аргумента для объявления экземпляра шаблона.

эта техника (чье присутствие в fastdelegate, видимо, из-за одного джоди hagins) был использован для упрощения декларация экземпляров, шаблон с полу-произвольное число параметров шаблона.

а именно, он позволил это что-то вроде следующего:

// a template with one parametertemplate<typename _t1>struct object1{    _t1 m_member1;};// a template with two parameterstemplate<typename _t1, typename _t2>struct object2{    _t1 m_member1;    _t2 m_member2;};// a forward declarationtemplate<typename _signature>struct object;// some derived types using "function signature"-style template parameterstemplate<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 declarationsobject1<int> intobjecta;object2<int, char> intcharobjecta;// b. nifty, but equivalent, object declarationstypedef 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;

несмотря на по-настоящему запахнет hackiness, я нахожу такого рода эмуляция spoofy шаблонов с переменным числом аргументов аргументы довольно умопомрачительных.

реальное мясо этот трюк, кажется, тот факт, что я могу передавать текстовые конструкты, как "тип1(тип2, тип3)" в качестве аргументов шаблонов. так вот мои вопросы: как именно компилятор интерпретировать эту конструкцию? это сигнатуры функции? или это просто текстовый шаблон со скобками в нем? если первое, то означает ли это, что любой произвольной сигнатуры функции является допустимым типом что касается процессора шаблона?

следующий вопрос будет, что, поскольку вышеупомянутые примеры кода действует код, почему не стандартные просто позволяют делать нечто вроде следующего, который не компилируется?

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;