我正在使用this code comment来存储std::variant
s的不同签名。所述函数存储在向量中,后者从映射中检索。
如何在std::function
的向量中调用每个函数?我觉得我应该使用std::variant
,但我无法弄清楚正确的用法。
{{1}}
答案 0 :(得分:2)
std::visit
要求变体中的每个类型都有一个有效的"动作"。如果func
现在有std::function<void(int)>
代替std::function<void(void)>
,那么就没有办法采取行动。因为这(可以)取决于运行时,std::visit
必须在编译时检查变量的每个可能的替代方法都可以用来调用你的callable。
例如,您可以将lambda合并在一起,或者为变体中的每种类型设置if constexpr
级联。
template<typename ...Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<typename ...Ts> overloaded(Ts...) -> overloaded<Ts...>;
std::visit(overloaded{
[](const std::function<void(void)> &Void) { std::invoke(Void); },
[](const std::function<void(int)> &Int) { std::invoke(Int, 1); }}, func);
答案 1 :(得分:2)
这是另一个例子,从cppreference page改编为你的情况:
{{1}}