如何迭代可变参数模板类型(而不是参数)?

Cas*_*yas 2 c++ templates variadic-templates c++14

我正在编写一个需要可变数量的模板类型的类。我需要为每种类型调用订阅者,但请注意,没有实际参数传递给该类。就像是:

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

Jar*_*d42 6

在您的示例中,在 C++17 中,您可能会执行以下操作:

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

在 C++11/14 中,您可能会使用更详细的方式,例如:

(C++14 目前使用通用 lambda)

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 包扩展仅限于几个地方,包括函数参数 (`f(args...)`)、initializer_list。前者不能确保从左到右的顺序,后者则可以。initializer_list 可用于构造数组,因此 `int dummy = {(f&lt;Ts&gt;(), 0)...};`。`(f&lt;Ts&gt;(), 0)` 使用逗号来确保返回类型为 `int`。然后void()用来处理邪恶的‘operator,’重载,额外的‘0,’用来处理空包。 (4认同)