有没有办法扩展和调用std::functions的元组?
Is there a way to expand and call a tuple of std::functions?
我有一个包含函数元组的 class,它们的 return 类型由 class 的模板确定:
template <typename... Ts>
class A{
static inline auto funcs = std::make_tuple(std::function<Ts()>()...)
};
我希望能够迭代这些函数。我尝试使用此答案中的方法从模板中获取每种类型的索引:
std::get<Index<Ts,Ts...>::value>(funcs)()...;
但是这段代码无法编译。它抱怨最后的“...”,可能是因为当我键入 "T..." 时模板参数包已经展开,但我不明白为什么它不让我展开另一个 [=21] =].有办法吗?
您必须删除 funcs
作业中的 {}
否则这将创建一个 initializer_list
而不是 tuple
static inline auto funcs = std::make_tuple(std::function<Ts()>()...);
然后您可以在 std::apply
和通用可变参数 lambda 的帮助下调用每个元组函数:
auto call = [](auto&&...funcs) {
(funcs(),...);
};
int main()
{
A<int, float, char> l;
std::get<0>(l.funcs) = []() { cout << "Calling int()" << endl; return 1; };
std::get<1>(l.funcs) = []() { cout << "Calling float()" << endl; return 1.f; };
std::get<2>(l.funcs) = []() { cout << "Calling char()" << endl; return '1'; };
std::apply(call, l.funcs);
return 0;
}
我有一个包含函数元组的 class,它们的 return 类型由 class 的模板确定:
template <typename... Ts>
class A{
static inline auto funcs = std::make_tuple(std::function<Ts()>()...)
};
我希望能够迭代这些函数。我尝试使用此答案中的方法从模板中获取每种类型的索引:
std::get<Index<Ts,Ts...>::value>(funcs)()...;
但是这段代码无法编译。它抱怨最后的“...”,可能是因为当我键入 "T..." 时模板参数包已经展开,但我不明白为什么它不让我展开另一个 [=21] =].有办法吗?
您必须删除 funcs
作业中的 {}
否则这将创建一个 initializer_list
而不是 tuple
static inline auto funcs = std::make_tuple(std::function<Ts()>()...);
然后您可以在 std::apply
和通用可变参数 lambda 的帮助下调用每个元组函数:
auto call = [](auto&&...funcs) {
(funcs(),...);
};
int main()
{
A<int, float, char> l;
std::get<0>(l.funcs) = []() { cout << "Calling int()" << endl; return 1; };
std::get<1>(l.funcs) = []() { cout << "Calling float()" << endl; return 1.f; };
std::get<2>(l.funcs) = []() { cout << "Calling char()" << endl; return '1'; };
std::apply(call, l.funcs);
return 0;
}