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

C++初始化继承的模板基类,c++,constructor,C++,Constructor,在我尝试传递模板参数包的过程中,将模板参数包传递给arbitary。考虑这个例子: struct Zero { Zero() {} }; struct Two { Two(int, int) {} }; template <class... Pack> struct User : Pack... { template <class... Params> User(Params... p) : Pack(p)... {} // How t

在我尝试传递模板参数包的过程中,将模板参数包传递给arbitary。考虑这个例子:

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类型的对象,如何将参数传递给正确的构造函数

最明显的解决方法是让一个元组构造函数为用户可以接受的每种类型只取一个元组,但这需要我修改0和2,这在我的用例中是非常困难的

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

您需要让用户构造函数接受一系列元组,然后将每个元组的参数转发到相应的基类

template <class... Tuples>
User(Tuples&&... t) : Pack(std::make_from_tuple<Pack>(std::forward<Tuples>(t)))... {}
请注意,由于保证了副本省略,类型Pack的临时副本。。。不会被实例化

您需要让用户构造函数接受一系列元组,然后将每个元组的参数转发到相应的基类

template <class... Tuples>
User(Tuples&&... t) : Pack(std::make_from_tuple<Pack>(std::forward<Tuples>(t)))... {}
请注意,由于保证了副本省略,类型Pack的临时副本。。。不会被实例化


您不一定要修改0或2,您只需要一个模板T make_footuple来解包元组并调用构造函数。@user463035818您能用一个例子详细说明一下吗?我不知道在构造函数的上下文中如何正确地解包。@user463035818 Brian已经这样做了。这确实是可能的。谢谢你指出这一点。太好了,因为我还没有找到怎么做的方法,我不得不紧急地去睡觉:你不一定要修改0或2,你只需要一个模板T make_footuple来解压元组并调用构造函数。@user463035818你能用一个例子来详细说明一下吗?我不知道在构造函数的上下文中如何正确地解包。@user463035818 Brian已经这样做了。这确实是可能的。非常感谢您指出这一点。太好了,因为我还没有找到如何实现它的方法,我不得不紧急地去睡觉:使用默认的复制构造函数来构造每个子类是一个非常好的解决方案。感谢您指出这一点,并向我介绍make_from_tuple函数。使用默认复制构造函数构造每个子类是一个非常简洁的解决方案。感谢您指出这一点,并向我介绍make_from_tuple函数。