可变基类的初始化
Initialization of variadic base classes
下面的代码不起作用。其目的是将参数传递给可变基类。这是可能的吗?如果是,实现它的正确方法是什么?(Clang的错误信息是:an initializer for a delegating constructor must appear alone
,我看不懂)
template<class... Visitors>
class Visited: public Visitors...
{
public:
template<class F>
Visited(const F& f): F(f) {}
template<class F, class... Rest>
Visited(const F& f, const Rest&... r):
F(f), Visited(r...) {}
};
struct A {};
struct B {};
struct C {};
int main()
{
A a;
B b;
C c;
Visited<A,B,C> v(a, b, c);
}
这要容易得多,而且它适用于(最新版本的)GCC和Clang:
template<class... Args>
Visited(const Args&... args) : Visitors(args)... {}
在每个基类中使用一个参数。如果您希望对参数进行完美的转发,请使用稍微不那么简洁的:
template<class... Args>
Visited(Args&&... args) : Visitors(std::forward<Args>(args))... {}
在这两种情况下,考虑在Visitors
只是一个类的情况下添加explicit
,并且您希望避免意外的转换。
相关文章:
- C++初始化基类
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 使用成员的地址初始化基类是否合法?
- 初始化基类成员 (c++) 的首选方法
- 类的构造函数必须显式初始化基类
- OOP - 抽象类类型,初始化基类和派生类中的变量
- 初始化基类和派生类中的类成员变量
- 为什么 C++ 的创建者决定使用构造函数初始值设定项列表来初始化基类?
- 通过drived类模板值通过基类构造器初始化基类数组成员变量
- 使用派生的[C++]生成的参数初始化基类
- C++ 在派生类中初始化基类的 const int?
- C++是否要求您从其派生类初始化基类成员
- 通过 CRTP 使用派生类变量初始化基类静态常量变量
- 初始化基类,派生类的构造函数中没有默认构造函数
- 我可以调用一个虚拟函数来初始化基类子对象吗
- 如何初始化基类构造函数的向量
- 初始化基类
- 在派生类的构造函数的主体中初始化基类成员变量
- 初始化基类的引用成员