用共享_from__this生成函子
Generate functor with shared_from_this
我想从eNable_shared_from_this继承的类a创建一个函子,也就是这样的类:
class A: public std::enable_shared_from_this<A> {
...
}
我想拥有一个看起来像这样的成员函数(不正确的代码(:
template <typename Args...>
std::function<void(Args ...)> functor_from_this(void (A::*method)(Args...)) {
return std::bind(method, shared_from_this());
}
上面的代码从warning C4180: qualifier applied to function type has no meaning; ignored
开始生成多个错误,这使我怀疑我以错误的方式对此进行了错误。我该如何实现这样的事情?
(a(将args的额外学分也绑定到函子,因此我得到了一个函数,其签名为 void fn()
,并且(b(在从 enable_shared_from_this<T>
继承的通用类中执行所有这些功能。
好吧,对于C 14,解决方案很容易编写。只是放弃std::bind
并返回lambda:
#include <memory>
#include <iostream>
#include <functional>
struct A: std::enable_shared_from_this<A> {
template <typename... Args>
std::function<void(Args...)> functor_from_this(void (A::*method)(Args...)) {
return [=, obj = shared_from_this()](Args... args) {
((*obj).*method)(args...);
};
}
void foo(int) { std::cout << "foo" << 'n'; }
void bar() { std::cout << "bar" << 'n'; }
};
int main()
{
auto a = std::make_shared<A>();
auto f = a->functor_from_this(&A::foo);
auto b = a->functor_from_this(&A::bar);
f(1);
b();
}
对于C 11,jarod42在评论中指出,使用更简单的中间变量:
#include <memory>
#include <iostream>
#include <functional>
struct A: std::enable_shared_from_this<A> {
template <typename... Args>
std::function<void(Args...)> functor_from_this(void (A::*method)(Args...)) {
auto obj = shared_from_this();
return [=](Args... args) {
((*obj).*method)(args...);
};
}
void foo(int) { std::cout << "foo" << 'n'; }
void bar() { std::cout << "bar" << 'n'; }
};
int main()
{
auto a = std::make_shared<A>();
auto f = a->functor_from_this(&A::foo);
auto b = a->functor_from_this(&A::bar);
f(1);
b();
}
以获得额外的信用(b(,这是我发现的解决方案,根据讲故事的答案&amp;jarod:
#include <memory>
#include <iostream>
#include <functional>
template <class T>
class enable_functor_from_this: public std::enable_shared_from_this<T> {
public:
template <typename... Args>
decltype(auto) functor_from_this(void (T::*method)(Args...)) {
auto obj = this->shared_from_this();
return [=](Args... args) {
((*obj).*method)(args...);
};
}
};
struct A: enable_functor_from_this<A> {
void foo(int) { std::cout << "foo" << 'n'; }
void bar() { std::cout << "bar" << 'n'; }
};
int main()
{
auto a = std::make_shared<A>();
auto f = a->functor_from_this(&A::foo);
auto b = a->functor_from_this(&A::bar);
f(1);
b();
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- C++错误:"error: int aaa::bbb is protected within this context"
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 指针'this'可以是共享指针吗?
- 如何在C++中通过我的应用程序共享"this"实例?
- 从析构函数传递到this的共享指针