variadic list неспециализированных шаблонов
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.09.14 21:42
Оценка:
привет!

есть такой код:
template<typename...>
struct invokers;
template<typename...>
struct services;

template<
     typename UC
    ,template<typename> class GC
    ,typename Invokers
    ,typename Services
>
struct server;

template<
     typename UC
    ,template<typename> class GC
    ,typename... Invokers
    ,typename... Services
>
struct server<UC, GC, invokers<Invokers...>, services<Services...>> {
    server(GC<UC> &gc)
        :gc(gc)
    {}

    void start() {
        auto ptr = std::make_shared<session<invokers<Invokers...>, services<Services...>>>();
        ptr->invoke(1, "my string");
    }

private:
    GC<UC> &gc;
};

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

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

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: variadic list неспециализированных шаблонов
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.09.14 21:47
Оценка:
т.е. использовать это предполагается так:
/***************************************************************************/

template<typename UC, template<typename> class GC>
struct first_invoker: invoker_base {
    first_invoker(UC &uc, GC<UC> &gc)
    {}
};

template<typename UC, template<typename> class GC>
struct second_invoker: invoker_base {
    second_invoker(UC &uc, GC<UC> &gc)
    {}
};

/***************************************************************************/

struct user_context {};
template<typename UC>
struct global_context {};

int main() {
    global_context<user_context> gc;

    using invokers = invokers<first_invoker, second_invoker>;
    using services = services<ping_service, statistic_service>;

    server<
         user_context
        ,global_context
        ,invokers
        ,services
    > serv(gc);
    serv.start();
}

/***************************************************************************/
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: variadic list неспециализированных шаблонов
От: wander  
Дата: 20.09.14 22:09
Оценка:
Здравствуйте, niXman, Вы писали:

X>вопрос в том, как я могу передать произвольный список неспециализированных шаблонов?


template < template <typename> class ...A>
class C
{
};


Оно?
Re[2]: variadic list неспециализированных шаблонов
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.09.14 22:18
Оценка:
Здравствуйте, wander, Вы писали:

W>Оно?

та хз. я так тоже пробовал...

вот что говорит:
session.cpp:107:43: error: type/value mismatch at argument 1 in template parameter list for 'template<class UC, template<class> class ...<template-parameter-1-2> > struct invokers'
 struct server<UC, GC, invokers<Invokers...>, services<Services...>> {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
session.cpp:107:43: error:   expected a type, got 'Invokers'

сам шаблон 'invokers' у меня описан так:
template<typename UC, template<typename> class... GC>
struct invokers;

но тут что-то не правильно, ибо получается так, что вариадик только для GC.
т.е. насколько я понимаю, 'invokers' должен быть описан так, чтоб он принимал произвольное кол-во пар содержащих 'typename UC, template<typename> class GC' ?
вот в чем затык...

если таки не получится разобраться — выложу компилябильный код. просто прототипирую некоторую архитектуру, о которой скоро на хабре будет статья, потому и не хочу "раскрывать всех карт"
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 20.09.2014 22:19 niXman . Предыдущая версия .
Re[3]: variadic list неспециализированных шаблонов
От: wander  
Дата: 20.09.14 22:30
Оценка:
Здравствуйте, niXman, Вы писали:

X>если таки не получится разобраться — выложу компилябильный код. просто прототипирую некоторую архитектуру, о которой скоро на хабре будет статья, потому и не хочу "раскрывать всех карт"


Может я конечно опять не так понял (плоховато уже соображаю), но вот так не пойдет?

template<template<typename> class ...>
struct invokers;
template<typename...>
struct services;

template<
     typename UC
    ,template<typename> class GC
    ,typename Invokers
    ,typename Services
>
struct server;

template<
     typename UC
    ,template<typename> class GC
    ,template<typename> class... Invokers
    ,typename... Services
>
struct server<UC, GC, invokers<Invokers...>, services<Services...>> {
    server(GC<UC> &gc)
        :gc(gc)
    {}
    void start() {
        auto ptr = std::make_shared<session<invokers<Invokers...>, services<Services...>>>();
                ptr->invoke(1, "my string");
    }

private:
    GC<UC> &gc;
};
Отредактировано 20.09.2014 22:32 wander . Предыдущая версия . Еще …
Отредактировано 20.09.2014 22:32 wander . Предыдущая версия .
Re[4]: variadic list неспециализированных шаблонов
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.09.14 22:38
Оценка:
та нет, что-то не так...

вот компилябельный(сильно упрощенный и не раскрывающий идеи) код(вдруг есть желание покопаться ):

template<template<typename, template<typename> class> class...>
struct t_invokers;
template<typename...>
struct t_services;

template<typename Invokers, typename Services>
struct type;

template<typename... Invokers, typename... Services>
struct type<t_invokers<Invokers...>, t_services<Services...>> {

};

/***************************************************************************/

template<typename UC, template<typename> class GC>
struct first_invoker {
    first_invoker(UC &uc, GC<UC> &gc)
    {}
};

template<typename UC, template<typename> class GC>
struct second_invoker {
    second_invoker(UC &uc, GC<UC> &gc)
    {}
};

struct ping_service {};
struct statistic_service {};

/***************************************************************************/

int main() {
    using _t_invokers = t_invokers<first_invoker, second_invoker>;
    using _t_services = t_services<ping_service, statistic_service>;
    type<_t_invokers, _t_services> t;
}

/***************************************************************************/


вот что говорит:
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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 20.09.2014 22:46 niXman . Предыдущая версия . Еще …
Отредактировано 20.09.2014 22:44 niXman . Предыдущая версия .
Отредактировано 20.09.2014 22:41 niXman . Предыдущая версия .
Re[5]: variadic list неспециализированных шаблонов
От: wander  
Дата: 20.09.14 22:48
Оценка: 15 (1)
Здравствуйте, niXman, Вы писали:

X>та нет, что-то не так...


X>вот компилябельный(сильно упрощенный и не раскрывающий идеи) код(вдруг есть желание покопаться ):


Вот что получилось:
template<template<typename, template<typename> class GC> class...>
struct t_invokers;

template<typename...>
struct t_services;

template<typename Invokers, typename Services>
struct type;

template<template <typename, template<typename> class GC> class... Invokers, typename... Services>
struct type<t_invokers<Invokers...>, t_services<Services...>>
{ };

struct invoker_base {};
/***************************************************************************/
template<typename UC, template<typename> class GC>
struct first_invoker : invoker_base
{
    first_invoker(UC &uc, GC<UC> &gc) {}
};

template<typename UC, template<typename> class GC>
struct second_invoker : invoker_base
{
    second_invoker(UC &uc, GC<UC> &gc) {}
};

struct ping_service {};
struct statistic_service {};
/***************************************************************************/

int main()
{
    using _t_invokers = t_invokers<first_invoker, second_invoker>;
/***************************************************************************/
    using _t_services = t_services<ping_service, statistic_service>;
    type<_t_invokers, _t_services> t;
}
Re[6]: variadic list неспециализированных шаблонов
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.09.14 22:51
Оценка:
о, да! ты мой рыцарь! =)

спасибо большое!

копаюсь дальше...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: variadic list неспециализированных шаблонов
От: wander  
Дата: 20.09.14 22:58
Оценка:
Здравствуйте, niXman, Вы писали:

X>копаюсь дальше...

Re[8]: variadic list неспециализированных шаблонов
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.09.14 23:00
Оценка:
Здравствуйте, wander, Вы писали:

W>

да, по-пиву сегодня не получилось, увы
зато завтра ошеек зажарю под коньяком
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: variadic list неспециализированных шаблонов
От: jazzer Россия Skype: enerjazzer
Дата: 21.09.14 02:35
Оценка: 15 (1)
Здравствуйте, 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 (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: variadic list неспециализированных шаблонов
От: swingus  
Дата: 21.09.14 07:44
Оценка:
Здравствуйте, 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 неспециализированных шаблонов
От: niXman Ниоткуда https://github.com/niXman
Дата: 21.09.14 09:04
Оценка:
Здравствуйте, jazzer, Вы писали:

вариант!
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: variadic list неспециализированных шаблонов
От: wander  
Дата: 21.09.14 10:41
Оценка:
Здравствуйте, swingus, Вы писали:

S>И вообще, кажется, template template parameters в вариадиках не разрешены.


Разрешены (14.1):
The syntax for template-parameters is:
template-parameter:
    type-parameter
    parameter-declaration

type-parameter:
    class ...opt identifieropt
    class identifieropt= type-id
    typename ...opt identifier opt
    typename identifier opt= type-id
    template < template-parameter-list > class ...opt identifier opt
    template < template-parameter-list > class identifier opt= id-expression
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.