我有一个名为
有没有一种方法可以提取“子参数包”。在上面的例子中,如果
这里的
处理程序类似于:
foo
的函数,它使用可变模板参数将一部分类型传递给调用它的函数bar
。例如: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
获取了函数参数的参数包,而match循环遍历元组funcs_
,检查dynamic_cast
是否成功,并执行第一个成功的函数。我已经实现了这些功能。处理程序类似于:
[] (handler* self, <ARGS>) -> void {
// ...
}
我基本上是试图摆脱self
参数。