可变基类的初始化

Initialization of variadic base classes

本文关键字:初始化 基类      更新时间:2023-10-16

下面的代码不起作用。其目的是将参数传递给可变基类。这是可能的吗?如果是,实现它的正确方法是什么?(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,并且您希望避免意外的转换。

<<p> 生活例子/strong>