访问并调用std :: function的变体

时间:2018-05-23 14:23:08

标签: c++ c++17

我正在使用this code comment来存储std::variant s的不同签名。所述函数存储在向量中,后者从映射中检索。

如何在std::function的向量中调用每个函数?我觉得我应该使用std::variant,但我无法弄清楚正确的用法。

{{1}}

2 个答案:

答案 0 :(得分:2)

std::visit要求变体中的每个类型都有一个有效的&#34;动作&#34;。如果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}}