gpt4 book ai didi

c++ - 访问并调用 std::function 的变体

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:15 27 4
gpt4 key购买 nike

我正在使用 std::variant存储 std::function 的不同签名秒。所述函数存储在 vector 中,后者从 map 中检索。

如何调用 vector 中的每个函数 std::variant ?我觉得我应该使用 std::visit但我不知道正确的用法。

#include <variant>
#include <functional>
#include <map>
#include <iostream>
#include <functional>

using var_t = std::variant<std::function<void(void)>, std::function<void(int)>>;
enum class EventEnum { A, B, C };

struct Controller {
template<EventEnum E>
void subscribe(var_t fn) {
auto& callbacksVec = callbacks.at(E);
callbacksVec.push_back(fn);
}

template<EventEnum E>
void notify() {
auto& callbacksVec = callbacks.at(E);
for (auto& func : callbacksVec) {
// std::visit([](auto& arg){ std::invoke(arg); }, func);
}
}

std::map<EventEnum, std::vector<var_t>> callbacks;
};

int main() {
auto fn = []() { std::cout << "lambda callback" << std::endl; };
Controller myController;
myController.subscribe<EventEnum::A>(fn);
myController.notify<EventEnum::A>();

return 0;
}

最佳答案

std::visit要求变体中的每个类型都有一个有效的“ Action ”。如果func有一个std::function<void(int)>而不是 std::function<void(void)>就像现在一样,那么就没有办法采取行动了。因为这(可以)取决于运行时,std::visit必须在编译时检查变体的每个可能替代方案都可用于调用您的可调用对象。

例如,您可以将 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);

关于c++ - 访问并调用 std::function 的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50490868/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com