【问题标题】:C++ How do you pass a member function into a functor parameter?C++ 如何将成员函数传递给仿函数参数?
【发布时间】:2018-03-06 18:39:17
【问题描述】:

我正在使用 TRI DDS - 这是我尝试调用的函数的原型:

template<typename T , typename Functor >
dds::sub::cond::ReadCondition::ReadCondition  (
  const dds::sub::DataReader< T > &  reader,  
  const dds::sub::status::DataState &  status,  
  const Functor &  handler  
)

所以我有一个看起来有点像这样的类(省略了一些不相关的东西):

MyClass test{
public:
    test(){... mp_reader = ...}; // not complete

    start_reader()
    {
        dds::sub::cond::ReadCondition rc(*mp_reader,
                                         dds::sub::status::DataState::any(),
                                         do_stuff());  // This does not work
    }

    void do_stuff() {...}
private:
    dds::sub::DataReader* mp_reader;

}

所以我只是尝试传入函数 do_stuff().. 我知道这行不通,但我不确定在此处放置什么来代替 const &amp; functor 参数。我可以传入成员函数吗? - 如何指定类的实例?

我尝试在其中放置一个 lambda 并且它有效 - 但我无法访问 lambda 中的 mp_reader,因为它不在 lambda 的范围内。但无论如何我真的不想使用 lambda 我真的想使用一个函数(所以,最终我可能能够传入一个外部函数)。

请参阅here 了解 RTI DDS 功能。以下是关于functor 类型的内容:

Any type whose instances that can be called with a no-argument function call (i.e. f(), if f is an instance of Functor). Examples are functions, types that override the operator(), and lambdas &lt;&lt;C++11&gt;&gt;. The return type has to be void

【问题讨论】:

  • Functor的类型是什么?它是模板参数吗?是类类型吗?
  • @FrançoisAndrieux 据我所知,它是任何返回 void 的函数(例如 void f())。我将添加到 ReadCondition() 构造函数的链接....
  • 解决你的问题取决于Functor是否是模板参数。
  • 可以用do_stuff()代替[this](){ this-&gt;do_stuff(); }吗?
  • @G.M.当我使用使用 mp_reader 的 lambda 编译时,我得到编译器错误:a lambda capture variable must be from an enclosing function scope ...这是我对该错误消息的解释:p

标签: c++ functor member-functions


【解决方案1】:

您可以将 lambda 函数与捕获一起使用。

dds::sub::cond::ReadCondition rc(*mp_reader,
                                 dds::sub::status::DataState::any(),
                                 [this](){ this->do_stuff(); });

【讨论】:

  • 是的,这是编译好的——我还没有正确测试它——我需要先写更多的代码。谢谢:) +1
【解决方案2】:

你可以使用std::bind(见http://en.cppreference.com/w/cpp/utility/functional/bind

dds::sub::cond::ReadCondition rc(*mp_reader,
                                 dds::sub::status::DataState::any(),
                                 std::bind(&MyClass::do_stuff, this));

另见How to directly bind a member function to an std::function in Visual Studio 11?

【讨论】:

  • 建议避免使用 std::bind 以支持 lambdas。 stackoverflow.com/a/36596295/1896169
  • 感谢您指出这一点!不过,我认为这仍然是完整性的有效答案。
  • (另外,再次感谢 Lavavej 视频的间接链接!youtu.be/zt7ThwVfap0?t=34m3s 上关于 lambdas 有效地拥有可以重新初始化捕获的复制构造函数的内容令人着迷。)
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2021-11-29
相关资源
最近更新 更多