是否可以调用静态方法形式可变参数模板类型参数?

Elv*_*gic 6 c++ variadic-templates

假设我们有类:

class A
{
public:
    static void m() {}
}

class B
{
public:
    static void m() {}
}

template<typename... T>
class C
{
public:
    void c()
    {
        T::m(); // Call somehow m() of A and B, if T is a parameter pack of A and B
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何扩展参数包并为每种类型调用静态方法?

Tar*_*ama 5

这个问题是我们不能只扩展参数包并在函数体内调用它,因为它不是有效的上下文.

void c()
{
    T::m()...;  //invalid context for parameter pack expansion
}
Run Code Online (Sandbox Code Playgroud)

有很多技巧可以解决这个问题.我通常使用的那个std::initializer_list:

void c()
{
    (void)std::initializer_list<int> { (T::m(), 0)... }; //valid context
}
Run Code Online (Sandbox Code Playgroud)

演示

在C++ 17中,我们将获得折叠表达式,这将大大简化:

void c()
{
    (T::m(), ...); //much nicer
}
Run Code Online (Sandbox Code Playgroud)