模板化 += 运算符重载与 std::p air 分配
Templated += operator overloading with std::pair assignment
我正在尝试在 C++ 11 中构建一个信号/插槽,我想通过 += 运算符使用"连接"函数,但由于 += 运算符只能接受一个参数,并且为了获取可调用的成员函数,我还需要对象指针。
因此,我必须使参数成为标准对代码如下:
#include <iostream>
class listener{
public:
void on_event(){ /* ... */ }
};
class event{
public:
template<typename T, typename F = void(T::*)()>
void operator+=( std::pair<T*, F> p ){
/* ... */
}
};
int main (int argc, char *argv[]) {
event e;
listener l;
e += std::pair(&l, &listener::on_event); // works
e += std::make_pair(&l, &listener::on_event); // works
e += {&l, &listener::on_event}; // NOT works!!
}
我的问题是,如何使其仅在用户端与{}一起使用?非常感谢!
如果您添加未模板化的特定函数重载,它就会起作用:
void operator+=(std::pair<listener*, void(listener::*)()> p) {
// Delegate to the other one (But prevent infinite
// recursion by specifying it's the template one)
operator+=<listener>(p);
}
e += {&l, &listener::on_event};
但这仅适用于listener
对象。我建议创建一个接受 2 个参数的成员函数:
template<typename T, typename F>
void add(T& object, F&& method) {
operator+=(std::pair<T*, F>(std::addressof(object), std::forward<F>(method)));
}
e.add(l, &listener::on_event);
相关文章:
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- C++:无法使用 "=" 运算符更改 std::p air 的值
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 使用 std::p air 进行返回值优化
- 标准::在双类和类的 std::p air 上更大
- 为什么 std::p air 的大小与其元素的大小之和不同?
- 像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?
- 查找 std::vector 中的最小值和最大值 std::p air
- 地图是否将元素存储为 std::p air?
- std::p air 会破坏其动态分配的对象吗?
- 如何在 std::p air 中使用 System::Guid 和自定义枚举?
- boost::mpl 不使用(甚至不兼容)std::p air 的原因是什么?
- 在具有 std::p air 键和值的映射中添加 b2vec2
- 无法访问 std::p air 的成员秒
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- 二进制">>":未找到采用类型为"std::p air<int,int>"的右操作数的运算符
- 初始化 std::initializer_list 通过 std:: 初始化 std::p air 在初始化 std::array 时不起作用?
- 通过预处理器创建 std::p air<std::string,some_enum>
- 使用 std::map 和 std::p air 作为键,并将列表作为值
- 为什么 std::map 接受 std::p air 作为密钥,而 std::unordered_map 不接受?