如何展开基类的参数包并调用每个基类的成员函数
How to expand parameter pack of base classes and call member function of each one?
我正在尝试使用可变模板进行类组合。其思想是Composer
类简单地聚合了许多变量,并将函数调用转发给所有实例化的变量。
首先,我使用以下简单的包装类:
template< typename T >
struct WrapperType
{
typedef T wrapped_type;
typedef typename wrapped_type::value_type value_type;
wrapped_type wrapee_;
WrapperType() : wrapee_{}
{}
};
这与以下Composer
类一起使用,该类有望从为参数包Args
:中的每种类型实例化的WrapperType
派生而来
template< typename... Args >
struct Composer : public WrapperType<Args>...
{
Composer() : WrapperType<Args>{}...
{}
void display()
{
((WrapperType<Args>...)::wrapee_).display(); // HOW?
}
};
假设每个封装的类型都有一个display()
成员函数,那么如何为参数包中的每个类型调用display()
函数呢?
I.E.如果我有:
Composer< T1, T2, T3 > myComposer{};
myComposer.display();
我希望myComposer.display()
为T1
、T2
、T3
调用display()
。
只有少数上下文可以进行包扩展([temp.variadic]/p5)。
在c++11和c++14中,您不能从函数调用创建包扩展,但您可以扩展它,即在数组初始值设定项列表中:
void display()
{
using discard = int[];
(void)discard{ 0, ((void)WrapperType<Args>::wrapee_.display(), 1)... };
}
演示
在c++17中,可以使用折叠表达式:
void display()
{
(WrapperType<Args>::wrapee_.display(), ...);
}
演示2
相关文章:
- 派生类看不到基类成员
- C++11: 如何访问派生类中的基类成员?
- Qml 未收到基类成员变量的更新值
- 指向从指针派生类成员函数的指针,指向基类成员函数
- 初始化基类成员 (c++) 的首选方法
- 访问多级复合关系中的基类成员
- 允许从特定派生类访问基类成员
- 在派生类的成员联合中包含继承的基类成员
- 由派生类设置的 constexpr 基类成员
- 从派生类调用的抽象基类成员函数
- 从抽象基类访问另一个基类成员
- C++派生类访问基类成员
- 不能引用派生模板类中的基类成员
- C2694 在析构函数上,当基类成员的析构函数具有非空 noexcept 说明符和主体时
- 在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败
- 在C 中访问带有不正确的下属的基类成员
- C++将基类成员链接到派生类成员
- 从基类成员函数返回派生类的实例
- 从指针到基类成员的模板推导
- 是否可以从派生类中排除基类成员?