可变基类的初始化

时间:2014-05-04 21:55:45

标签: c++ templates c++11 variadic

以下代码不起作用。它的目的是将参数传递给可变参数基类。这是可能的,如果可行,那么实施它的正确方法是什么? (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);
}

1 个答案:

答案 0 :(得分:6)

这更容易,它适用于(GCC和Clang的近期版本):

template<class... Args>
Visited(const Args&... args) : Visitors(args)... {}

每个基类使用一个参数。如果您想要完美转发参数,请使用稍微简洁的一点:

template<class... Args>
Visited(Args&&... args) : Visitors(std::forward<Args>(args))... {}

在这两种情况下,请考虑为explicit只是一个类并且您希望避免意外转换的情况添加Visitors

Live example