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

时间:2014-09-29 17:43:11

标签: c++ templates c++11 variadic-templates

我正在尝试使用可变参数模板进行类组合。我们的想法是Composer类只是聚合了许多变量,并将函数调用转发给所有实例变量。

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

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

    WrapperType() : wrapee_{}
    {}
};

这与以下Composer类一起使用,希望从WrapperType为参数包Args中的每个类型实例化得出:

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

    void display()
    {
        ((WrapperType<Args>...)::wrapee_).display();   // HOW?
    }
};

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

即。如果我有:

Composer< T1, T2, T3 > myComposer{};
myComposer.display();  

我希望myComposer.display()display()T1T2致电T3

1 个答案:

答案 0 :(得分:6)

只有少数情况可以发生 pack-expansion [temp.variadic] / p5)。

中,您无法通过函数调用创建 pack-expansion ,但您可以将其展开,即在数组初始化程序中-list

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

DEMO

中,可以使用 fold-expressions

void display()
{
    (WrapperType<Args>::wrapee_.display(), ...);
}  

DEMO 2