我想如下转发的一系列参数,以两种不同的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...) {
}
};
检查和处理程序是密新课程针对不同需求的两个不同的集合每个成员都共享需求。我意识到我不能在Tester中做一个双变量构造(编译器不能推断出在哪里分割参数,所以把它们全部传递给Handler而没有传递给Checker),所以我传递了Tuple中的Checker参数和Handler参数一个可变名单。问题是,Checker的构造函数负责将这些参数转发给它的基地。 Handler可以这样做,因为Handler的构造函数是一个可变参数列表,但Checker获取一个元组,但是不能为每个元素转发一个元组,如向前可以包含可变参数列表。
任何意见将不胜感激。谢谢。
附加
的溶液。将或者a)解压argc
成Checker
的可变参数的构造或b)使Checker
的构造采取一个元组,然后以某种方式转发该元组中的每个元素的每一个Checker
的mixin碱基,Checkers...
。我知道std::pair
有一个将元组作为固定参数列表转发给它的类型的技巧,例如使用std::piecewise_construct
类型标记的3参数std::vector
构造函数通知它进行解压缩,但我不明白这可能是什么在这里应用。我查看了std::piecewise_construct
的GCC 4.8.1的std::pair
的执行情况,但无法弄清楚。我阅读了一些关于模板元编程的旧版C++ 11之前的书籍(例如,Modern C++ Design和C++ Template Metaprogramming),但是现在我不知道这里有标准,试图避免Boost和Loki。
附加
必须符合至少GCC 4.7.2。我找到的基于std::pair
的解决方案需要构造函数继承,直到GCC 4.8.1才生效,这在我的构建系统上不受支持。
附加
虽然GCC 4.6.3支持将是很好的,委托构造在4.7.2中加入所以我应该有机会获得该语言功能。在他的博客上面指定
可能[this SO question](http://stackoverflow.com/questions/10766112/c11-i-can-go-from-multiple-args-to-tuple-but-can-i-go-from双倍)可以提供帮助。 – maverik
我还不确定,因为问题是调用一个基本的构造函数,这是一个有限的调用约定,所以我的第一读书是行不通的,但让我仔细考虑它,看看我是否可以扭曲它来匹配我正在寻找。 – TimeHorse
你可以模拟'std :: pair'的“分段”构造函数。 –