首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用enable_if将信号2绑定到纯函数或成员函数

使用enable_if将信号2绑定到纯函数或成员函数
EN

Stack Overflow用户
提问于 2016-07-08 13:07:24
回答 1查看 417关注 0票数 0

我目前正在尝试实现一个类的成员函数,该函数允许设置回调,回调本身要么是一个成员函数(可能是一个不同的类),要么是一个非类的纯函数。

有了这样一个阶级,

代码语言:javascript
复制
#include <boost/signals2.hpp> // for callback
class CallbackSetter
{ 
  template <typename T>
  void setCallback(T &p_rCallback)
  {
     m_oCallback.connect(boost::bind(&p_rCallback, _1);
  }
  boost::signals2::signal<void(const std::string &p_rTLName)> m_oCallback; 
}


CallbackSetter oSetter;
oSetter.setCallback(theFunction);

适用于非会员方法。然而,我在某种程度上无法实现某种允许用户连接到not成员的东西。这就是我试过的:

代码语言:javascript
复制
class CallbackSetter
{ 
  template <typename T, typename Cl, 
    typename std::enable_if_t<!std::is_class<Cl>::value>>
  void setCallback(T &p_rCallback, Cl & p_rCallbackclass)
  {
     m_oCallback.connect(boost::bind(&p_rCallback, p_rCallbackclass, _1);
  }

  template <typename T, typename Cl,
    typename std::enable_if_t<std::is_class<Cl>::value> >
  void setSignalChangeCallback(T &p_rCallback, Cl & p_rCaller)
  {
    m_oObserverCallback.connect(boost::bind(&p_rCallback, p_rCaller, _1));
  }
}

由其他类的成员函数调用,如下所示:

代码语言:javascript
复制
#include <string>
class OtherClass
{
  void caller()
  {
    m_oMyCS.setCallback(&OtherClass::executeMe, this);
  }
  void executeMe(std::string &p_rTag)
  {
    // do whatever with p_rTag
  }

  CallbackSetter m_oMyCS;
}

最后

代码语言:javascript
复制
void noMemberExec(std::string &p_rTag)
{
  // do whatever
}

int main()
{
  OtherClass oOC;
  oOC.caller();
  CallbackSetter oCS;
  oCS.setCallback(&noMemberExec, nullptr);
  return 0;
}

这里的任何帮助都欢迎!

P.S.:我使用的是VS 2015,这是一个错误。

代码语言:javascript
复制
C2783: error calling 'setCallback(T&, CL&)': could not deduce template argunemt for '__formal'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-08 13:52:12

与其为setCallback()设置不同的重载,而且还要考虑不同的情况--只需提供一个:

代码语言:javascript
复制
template <class F>
void setCallback(F f)
{
    m_oCallback.connect(f);
}

用户只需提供一个可以用std::string const&调用的函数。如果我希望它调用一个接受单个参数的自由函数,我只需要这样做:

代码语言:javascript
复制
oCS.setCallback(noMemberExec);

如果我希望它在类实例上调用一个成员函数,我会显式地这样做:

代码语言:javascript
复制
m_oMyCS.setCallback([this](std::string const& arg){ executeMe(arg); });

无论哪种方式,我都要将一个可调用的单个参数传递到setCallback()中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38267526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档