код компилится и работает как надо, если в качестве третьего и четвертого параметров указывать нешаблонные типы. но Invokers должны быть шаблонными типами. они все должны специализироваться одними и теми же типами, и я это хочу сделать внутри session. (этот код я не привожу за ненадобностью)
вопрос в том, как я могу передать произвольный список неспециализированных шаблонов?
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
но тут что-то не правильно, ибо получается так, что вариадик только для GC.
т.е. насколько я понимаю, 'invokers' должен быть описан так, чтоб он принимал произвольное кол-во пар содержащих 'typename UC, template<typename> class GC' ?
вот в чем затык...
если таки не получится разобраться — выложу компилябильный код. просто прототипирую некоторую архитектуру, о которой скоро на хабре будет статья, потому и не хочу "раскрывать всех карт"
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>если таки не получится разобраться — выложу компилябильный код. просто прототипирую некоторую архитектуру, о которой скоро на хабре будет статья, потому и не хочу "раскрывать всех карт"
Может я конечно опять не так понял (плоховато уже соображаю), но вот так не пойдет?
variadic.cpp:11:35: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class, template<class> class<template-parameter-2-2> > class ...<template-parameter-1-1> > struct t_invokers'
struct type<t_invokers<Invokers...>, t_services<Services...>> {
^
variadic.cpp:11:35: error: expected a class template, got 'Invokers ...'
variadic.cpp:11:60: error: template argument 1 is invalid
struct type<t_invokers<Invokers...>, t_services<Services...>> {
^
variadic.cpp: In function 'int main()':
variadic.cpp:37:33: error: aggregate 'type<t_invokers<first_invoker, second_invoker>, t_services<ping_service, statistic_service> > t' has incomplete type and cannot be defined
type<_t_invokers, _t_services> t;
^
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>та нет, что-то не так...
X>вот компилябельный(сильно упрощенный и не раскрывающий идеи) код(вдруг есть желание покопаться ):
Здравствуйте, niXman, Вы писали:
X>вопрос в том, как я могу передать произвольный список неспециализированных шаблонов?
(я знаю, что проблема с передачей шаблонов уже решена wander-ом)
Как вариант, можно передавать metafunctions class (в терминологии MPL).
Т.е. класс типа
struct first_invoker // не шаблон!
{
template<typename...T>
struct apply { typedef/*тут то, что у тебя обычно лежало бы*/ type; };
};
Т.е, поскольку ты все равно инстанцируешь потом, то можно передавать обычные нешаблонные типы с шаблонами внутри.
Ну а инстанцируешь, соответственно, не first_invoker<T1,T2,T3>, a first_invoker::apply<T1,T2,T3>::type.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, niXman, Вы писали:
X>>вопрос в том, как я могу передать произвольный список неспециализированных шаблонов?
J>(я знаю, что проблема с передачей шаблонов уже решена wander-ом)
J>Как вариант, можно передавать metafunctions class (в терминологии MPL). J>Т.е. класс типа J>
J>struct first_invoker // не шаблон!
J>{
J> template<typename...T>
J> struct apply { typedef/*тут то, что у тебя обычно лежало бы*/ type; };
J>};
J>
J>Т.е, поскольку ты все равно инстанцируешь потом, то можно передавать обычные нешаблонные типы с шаблонами внутри. J>Ну а инстанцируешь, соответственно, не first_invoker<T1,T2,T3>, a first_invoker::apply<T1,T2,T3>::type.
Вот-вот, а заворачивать темплейтный параметр в metafunction class можно при помощи boost::mpl::quote1,... И вообще, кажется, template template parameters в вариадиках не разрешены.
Re[2]: variadic list неспециализированных шаблонов