C ++初始化继承的模板基类

时间:2018-09-10 22:34:32

标签: c++ constructor

我正在尝试在构造过程中将任意参数传递给通过模板参数包继承的类。考虑以下示例:

struct Zero {
    Zero() {}
};

struct Two {
    Two(int, int) {}
};

template <class... Pack>
struct User : Pack... {
    template <class... Params>
    User(Params... p) : Pack(p)... {} // How to do this correctly?
};

auto test = User<Zero, Two>(1,2);

如果我现在尝试构造类型为User<Zero, Two>的对象如何将Params传递给正确的构造函数?

最明显的解决方法是让一个元组构造函数对每个User可以接受的每个类型正好取一个元组,但这需要我修改ZeroTwo,这非常在我的用例中很困难。

这可能吗?也欢迎其他解决方法。

1 个答案:

答案 0 :(得分:5)

您需要让User构造函数接受一个元组序列,然后将参数从每个单独的元组转发到相应的基类。

template <class... Tuples>
User(Tuples&&... t) : Pack(std::make_from_tuple<Pack>(std::forward<Tuples>(t)))... {}

请注意,由于保证了复制保留,将不会实例化Pack...类型的临时对象。

Live on Coliru