访问并调用 std::function 的变体
Visit and invoke a variant of std::function
我正在使用std::variant
来存储std::function
的不同签名。 所述函数存储在向量中,后者从映射中检索。
如何在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
要求变体中的每个类型都有一个有效的"操作"。如果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);
这是另一个示例,根据 cpp 首选项页面改编到您的情况:
#include <iomanip>
#include <iostream>
#include <string>
#include <type_traits>
#include <variant>
#include <vector>
#include <functional>
using var_t = std::variant<std::function<void(void)>, std::function<void(int)>>;
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main() {
std::vector<var_t> vec = {
[]() {std::cout << "void" << std::endl;},
[](int arg) {std::cout << "int " << arg << std::endl;}
};
for (auto& v: vec) {
std::visit(overloaded {
[](const std::function<void(void)>& fv) { fv(); },
[](const std::function<void(int)>& fi) { fi(42); }
}, v);
}
}
相关文章:
- 通过方法访问结构
- "error: no matching function for call to"构造函数错误
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 调用专用模板时出错"no matching function for call to [...]"
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从 std::function in C++ 访问模板化 lambda
- 访问并调用 std::function 的变体
- 如何在C++中使用 std::function 访问函子的成员函数
- C++ Lambda:访问 lambda 中的静态方法会导致错误'this was not captured for this lambda function'
- 如何在"boost::function"中访问类实例(对象)指针?
- 如何在不使用头文件的情况下以'function'形式访问另一个C++文件?
- 如何访问通过引用传递给operator= function的对象的私有数据?