Как перебирать шаблоны типа Variadi c (не аргументы)? - PullRequest
0 голосов
/ 29 апреля 2020

Я пишу класс, который ожидает переменного числа типов шаблонов. Мне нужно вызывать подписчика для каждого типа, но учтите, что фактические аргументы не передаются классу. Что-то вроде:

template<typename... T>
class Subscriber
{
    Subscriber()
    {
        // for(typename X: T)   <-- How to do this?
        // {
        //      PubSub.Subscribe<X>( [](auto data){ // do something with data} );
        // }
    }
}

1 Ответ

4 голосов
/ 29 апреля 2020

В вашем примере в C ++ 17 вы могли бы сделать:

template<typename... Ts>
class Subscriber
{
    Subscriber()
    {
        auto f = [](auto data){ /* do something with data*/ };
        (PubSub.Subscribe<Ts>(f), ...);
    }
}

В C ++ 11/14 вы можете использовать более подробный способ, например:

(C ++ 14 в настоящее время с вашим generi c лямбда)

template<typename... Ts>
class Subscriber
{
    Subscriber()
    {
        auto f = [](auto data){ /* do something with data*/ };
        int dummy[] = {0, (PubSub.Subscribe<Ts>(f), void(), 0)...};
        static_cast<void>(dummy); // Avoid warning for unused variable.
    }
}
...