具有变量Number of Arguments的std::函数的矢量
Vector of std::function with variable Number of Arguments
我想将event_handler
存储到std::vector中,然后将std::vector
存储到map
中。根据映射键,我将使用不同的参数调用listeners[index].handler_(args...)
。
我意识到以上是不可能的,因为std::vector不能存储不同的类型;但我想知道我是否还有其他选择。
template<class... Args>
using Handler = std::function<void(Args &&... args)>;
template<typename T>
struct event_handler {
event_handler(Handler<T> handler, bool once) : handler_(std::move(handler)), once_(once) {}
Handler<T> handler_;
bool once_;
};
std::vector<event_handler> listeners; // I known this line is wrong, here is just for example
您必须将要传递给事件处理函数的值与event_handler
(可能为none/zero(和event_handler
的应用程序/用户想要传递的值分开。
前者在std::function
类型中定义为参数,当然,对于所有函数,此参数列表必须相同
当使用std::bind()
将函数传递给事件处理程序时,后者将绑定到函数调用。
请注意,此解决方案承担的风险是,库的用户将指针或引用绑定到执行处理程序时不再存在的变量/对象。
相关文章:
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数