用共享_from__this生成函子

Generate functor with shared_from_this

本文关键字:this 共享 from      更新时间:2023-10-16

我想从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();
}