我正在尝试使用可变参数模板进行类组合。我们的想法是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()
,T1
,T2
致电T3
。
答案 0 :(得分:6)
只有少数情况可以发生 pack-expansion ([temp.variadic] / p5)。
在c++11和c++14中,您无法通过函数调用创建 pack-expansion ,但您可以将其展开,即在数组初始化程序中-list :
void display()
{
using discard = int[];
(void)discard{ 0, ((void)WrapperType<Args>::wrapee_.display(), 1)... };
}
在c++17中,可以使用 fold-expressions :
void display()
{
(WrapperType<Args>::wrapee_.display(), ...);
}