Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将元组传递给变量mixin类_C++_Constructor_Variadic Templates_Template Mixins - Fatal编程技术网

C++ 将元组传递给变量mixin类

C++ 将元组传递给变量mixin类,c++,constructor,variadic-templates,template-mixins,C++,Constructor,Variadic Templates,Template Mixins,我尝试将一系列参数转发到两个不同的mixin类,如下所示: template <typename... Checkers> class Checker : public Checkers... { public: template<typename... Args> Checker(Args&&... args) : Checkers(std::forward<Args>(args))... { } }; template &

我尝试将一系列参数转发到两个不同的mixin类,如下所示:

template <typename... Checkers>
class Checker : public Checkers... {
public:
    template<typename... Args>
    Checker(Args&&... args) : Checkers(std::forward<Args>(args))... { }
};

template <typename... Handlers>
class Handler : public Handlers... {
public:
    template <typename... Args>
    Handler(Args&&... args) : Handlers(std::forward<Args>(args))... { }
};

template <typename C, typename H>
class Tester : public C, H {
public:
    template <typename... ArgC, typename... ArgH>
    Tester(std::tuple<ArgC...>&& argc, ArgH&&... argh) : C(argc), H(argh...) {
    }
};
模板
类检查器:公共检查器。。。{
公众:
模板
检查器(Args&&…Args):检查器(std::forward(Args))…{}
};
模板
类处理程序:公共处理程序。。。{
公众:
模板
处理程序(Args&&…Args):处理程序(std::forward(Args))…{
};
模板
类别测试人员:公共C、H{
公众:
模板
测试器(std::tuple&&argc,ArgH&&ArgH):C(argc),H(ArgH…){
}
};
Checker和Handler是两个不同的Mixin类集合,每个类都有不同的要求,但所有成员都有相同的要求。我意识到我无法在Tester中进行双变量构造(编译器无法推断在何处拆分参数,因此将它们全部传递给Handler,而不传递给Checker),因此我将Checker参数传递到元组中,将Handler参数传递到变量列表中。问题是,Checker的构造函数负责将这些参数转发给它的基。Handler可以这样做,因为Handler的构造函数是一个可变列表,但Checker会得到一个元组,但不能为每个元组转发一个元组元素,比如转发一个可变参数列表

如有任何建议,将不胜感激。谢谢

附加的

一个解决方案是:A)将
argc
解包到
Checker
的可变构造函数中,或者b)让
Checker
的构造函数取一个元组,然后以某种方式将该元组的每个元素转发到
Checker
的每个混合基,
Checker…
。我意识到
std::pair
有一个将元组作为固定参数列表转发到其类型的技巧,例如一个3参数
std::vector
构造函数,使用
std::pieclewise_construct
类型标记通知它进行解包,但我不知道如何在这里应用它。我查看了GCC4.8.1的
std::pair
std::pieclewise_构造的实现,但没有弄清楚。我读了一些关于模板元编程(C++的设计和C++模板元编程)的更古老的、C++的11本书,但是我现在在这里有一个标准,我试图避免Boost和洛基。
附加的

必须至少符合GCC 4.7.2的要求。我找到的基于
std::pair
的解决方案需要构造函数继承,直到GCC 4.8.1才可用,我的构建系统不支持这种继承

附加的

虽然GCC4.6.3支持会很好,但在4.7.2中添加了委托构造函数,所以我应该可以访问该语言功能

Davidbrcz在其博客中指定的解决方案足以解决我的难题。解决方案相当复杂,因此我将引导您访问他的页面,但基本思想是动态创建一个数值索引元组,即std::maketuple(0,1,2,…),其中元组包含您需要枚举的元组的各个成员的每个索引。然后你只需使用:

M(std::forward<ArgM>(std::get<IdxM>(argm))...)
M(std::forward(std::get(argm))…)
对于上面示例中的C或H以及ArgM,M和IdxM的参数是相同大小的索引元组。因为列表的长度相同,所以列表会依次展开到参数中,元组也会被解包

限制是因为您希望将构建索引元组的复杂步骤隐藏为实现细节,您需要使用构造函数委托,以便公共构造函数接受2个元组,然后委托给私有构造函数,后者接受2个值元组和2个索引元组。GCC 4.7.2支持委托构造函数,但4.6.3不支持

为了解决这个问题,您需要将4参数构造函数(2个值元组,2个索引元组)公开,然后我编写了一个宏来填充索引元组参数:

#if __GNUC__ < 4 || __GNUC_MINOR__ <= 6
#define ZEROPARAM , detail::make_indices<>::type()
#define ONEPARAM , detail::make_indices<int>::type()
#define TWOPARAM , detail::make_indices<int, int>::type()
#define THREEPARAM , detail::make_indices<int, int, int>::type()
#define FOURPARAM , detail::make_indices<int, int, int, int>::type()
#define FIVEPARAM , detail::make_indices<int, int, int, int, int>::type()
#define SIXPARAM , detail::make_indices<int, int, int, int, int, int>::type()
#define SEVENPARAM , detail::make_indices<int, int, int, int, int, int, int>::type()
#define EIGHTPARAM , detail::make_indices<int, int, int, int, int, int, int, int>::type()
#define NINEPARAM , detail::make_indices<int, int, int, int, int, int, int, int, int>::type()
#define TENPARAM , detail::make_indices<int, int, int, int, int, int, int, int, int, int>::type()
#else // __GNUC__ < 4 || __GNUC_MINOR__ <= 6
#define ZEROPARAM
#define ONEPARAM
#define TWOPARAM
#define THREEPARAM
#define FOURPARAM
#define FIVEPARAM
#define SIXPARAM
#define SEVENPARAM
#define EIGHTPARAM
#define NINEPARAM
#define TENPARAM
#endif // __GNUC__ < 4 || __GNUC_MINOR__ <= 6

#if uu GNUC uu<4 | | uu GNUC u MINOR uuu_u_u)可能会有帮助。我还不确定问题是调用一个基本构造函数,它有一点调用约定的限制,所以我的第一个理解是这不起作用,但让我仔细考虑一下,看看是否可以将其扭曲以匹配我正在寻找的内容。您可以模拟“分段”构造函数std::pair的构造函数。我见过很多这样做的尝试,但我不知道如何使它成为通用的,以允许任意数量的混合。Pair有两种绑定模板类型,但n绑定的一般情况如何?主要是,我试图看看是否可以应用,但仍然无法建立连接。