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.
只有少数情况可以发生包扩展([temp.variadic]/p5).
在c ++ 11和c ++ 14中,您无法通过函数调用创建包扩展,但您可以在数组初始化列表中扩展它:
void display()
{
using discard = int[];
(void)discard{ 0, ((void)WrapperType<Args>::wrapee_.display(), 1)... };
}
Run Code Online (Sandbox Code Playgroud)
在c ++ 17中,可以使用fold-expressions:
void display()
{
(WrapperType<Args>::wrapee_.display(), ...);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1097 次 |
| 最近记录: |