我正在尝试将一系列参数转发到两个不同的 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...) {
}
};
Checker 和 Handler 是两个不同的 Mixin 类集合,它们对每个类都有不同的要求,但对所有成员都有共同的要求。我意识到我不能在 Tester 中进行双可变参数构造(编译器无法推断在哪里拆分参数,因此将它们全部传递给 Handler 而没有传递给 Checker)所以我将 Checker 参数传递给 Tuple 并将 Handler 参数传递给可变参数列表。问题是,Checker 的构造函数负责将这些参数转发到它的基础。Handler 可以这样做,因为 Handler 的构造函数是一个可变参数列表,但是 Checker 得到一个元组但你不能 for-each 转发一个元组的元素,比如 forward 可以是一个可变参数列表。
任何建议将不胜感激。谢谢。
额外的
一个解决方案是 a) 解压argc
到Checker
的可变参数构造函数中,或者 b) MakeChecker
的构造函数采用一个元组,然后以某种方式将该元组的每个元素转发到每个Checker
mixin 基Checkers...
。我意识到std::pair
有一个技巧可以将元组作为固定参数列表转发到它的类型,例如std::vector
使用类型标记的 3 参数构造函数std::piecewise_construct
来通知它进行解包,但我不知道如何在这里应用它。我查看了 GCC 4.8.1 的std::pair
with实现,std::piecewise_construct
但无法弄清楚。我阅读了一些关于模板元编程的较早的 C++11 之前的书籍(现代 C++ 设计和C++ 模板元编程,例如),但现在有一个标准,我在这里不知所措,我试图避免使用 Boost 和 Loki。
额外的
必须至少符合GCC 4.7.2。我找到的解决方案std::pair
需要Constructor Inheritance,直到GCC 4.8.1才可用,我的构建系统不支持它。
额外的
尽管对GCC 4.6.3的支持会很好,但在 4.7.2 中添加了委托构造函数,因此我应该可以访问该语言功能。