std函数-C++弱函子解
std function - C++ weak functor solution
这是void()函数特有的,但对我来说没问题…
struct Foo
{
void Bar(int x)
{
std::cout << x << std::endl;
}
};
struct VoidBind
{
typedef void result_type;
template<typename T> void operator()(const std::weak_ptr<T>& obj, std::function<void()>& func)
{
std::shared_ptr<T> shared_obj = obj.lock();
if (shared_obj)
{
func();
}
}
template<typename T> static std::function<void()> bind(const std::shared_ptr<T>& obj, const std::function<void()>& func)
{
return std::bind(VoidBind(), std::weak_ptr<T>(obj), func);
}
};
#define BIND(F, O, A...) VoidBind::bind(O, std::function<void()>(std::bind(F, O.get(), ##A)))
此代码随后被调用为…
auto obj = std::make_shared<Foo>();
auto func = BIND(&Foo::Bar, obj, 99); // match std::bind style
func();
obj.reset(); // destroy object
func(); // will not do anything
我的问题是,是否有某种方法可以避免BIND宏?
这里可以使用可变模板:
template<class F, class O, class... Args>
auto bind(F f, O&& o, Args&&... args)
-> decltype(VoidBind::bind(o, std::function<void()>(std::bind(f, O.get(), args...))))
{
return VoidBind::bind(O, std::function<void()>(std::bind(F, O.get(), args...)));
}
使用C++14自动返回类型扣除,甚至不需要指定返回值,效果会更好:
template<class F, class O, class... Args>
auto bind(F f, O&& o, Args&&... args)
{
return VoidBind::bind(o, std::function<void()>(std::bind(f, O.get(), args...)));
}
您是否考虑过使用lambda表达式而不是函子对象——功能相同,但更紧凑,并且绑定是lambda声明的一部分。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗