如何扩展基类的参数包并调用每个参数包的成员函数?

mar*_*ark 2 c++ templates variadic-templates c++11

我正在尝试使用可变参数模板进行类组合.这个想法是Composer该类简单地聚合了许多变量并将函数调用转发给所有实例化的变量.

首先,我使用以下简单的包装类:

template< typename T >
struct WrapperType
{
    typedef T wrapped_type;
    typedef typename wrapped_type::value_type value_type;
    wrapped_type wrapee_;

    WrapperType() : wrapee_{}
    {}
};
Run Code Online (Sandbox Code Playgroud)

这与下面的Composer类一起使用,希望从WrapperType参数包中的每个类型实例化派生Args:

template< typename... Args >
struct Composer : public WrapperType<Args>...
{
    Composer() : WrapperType<Args>{}...
    {}

    void display()
    {
        ((WrapperType<Args>...)::wrapee_).display();   // HOW?
    }
};
Run Code Online (Sandbox Code Playgroud)

假设每个包装类型都有一个display()成员函数,如何display()为参数包中的每个类型调用该函数?

IE如果我有:

Composer< T1, T2, T3 > myComposer{};
myComposer.display();  
Run Code Online (Sandbox Code Playgroud)

我想myComposer.display()呼吁display()T1,T2,T3.

Pio*_*cki 7

只有少数情况可以发生包扩展([temp.variadic]/p5).

您无法通过函数调用创建包扩展,但您可以在数组初始化列表中扩展它:

void display()
{
    using discard = int[];
    (void)discard{ 0, ((void)WrapperType<Args>::wrapee_.display(), 1)... };
}  
Run Code Online (Sandbox Code Playgroud)

DEMO

可以使用fold-expressions:

void display()
{
    (WrapperType<Args>::wrapee_.display(), ...);
}  
Run Code Online (Sandbox Code Playgroud)

演示2