【发布时间】:2017-12-23 15:09:41
【问题描述】:
我有一个函数foo,它调用一个函数bar,其中一部分类型传递到foo 的可变参数模板中。例如:
template <typename... T>
void foo() {
// ...
template <size_t start_idx, typename... T>
using param_pack = /*Parameter pack with T[start_idx]...T[N]*/
auto b = bar<param_pack<2, T...>>();
// ...
}
有没有办法提取“子参数包”。在上述情况下
如果T = [int float char double] 那么param_pack<2, T...> = [char double]
[编辑]
我的目标是能够使用这样的东西来匹配事件处理程序。例如
struct ev {};
template <typename... T>
struct event : ev {
std::tuple<T...> data_;
event(T&&... d) : data_(std::make_tuple(std::forward<T>(d)...)) {}
};
template <typename... Functor>
struct handler {
std::tuple<Functor...> funcs_;
handler(Functor&&... f) : funcs_(std::make_tuple(std::forward<Functor>(f)...)) {}
void handle_message(ev* e) {
auto ptrs = std::make_tuple(
dynamic_cast<event<param_pack<1, typename function_traits<F>::args>>*>(e)...
);
match(ptrs);
}
};
这里function_traits::args 获取函数参数的参数包并匹配迭代元组funcs_ 检查dynamic_cast 是否成功并执行第一个成功的函数。我已经实现了这些。
处理程序类似于
[] (handler* self, <ARGS>) -> void {
// ...
}
我实际上是在尝试摆脱 self 参数。
【问题讨论】:
-
糟糕...我的错...现在进行编辑
标签: c++ c++14 metaprogramming variadic-templates variadic-functions