boost :: signal2使用enable_if绑定到纯函数或成员函数

时间:2016-07-08 13:07:24

标签: c++ enable-if boost-signals2

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

鉴于这样的课程,

#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);

适用于非成员方法。但是,我有点无法实现让用户连接到其他成员的东西。这就是我试过的:

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));
  }
}

被其他一些班级称呼&#39;会员功能如下:

#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;
}

最后

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,它会退出并出现错误

C2783: error calling 'setCallback(T&, CL&)': could not deduce template argunemt for '__formal'

1 个答案:

答案 0 :(得分:2)

不是为setCallback()设置不同的重载并试图考虑不同的情况 - 只需提供一个:

template <class F>
void setCallback(F f)
{
    m_oCallback.connect(f);
}

由用户提供可以使用std::string const&调用的功能。如果我想让它以一个参数调用一个自由函数,我就这么做:

oCS.setCallback(noMemberExec);

如果我想让它在类实例上调用成员函数,我会明确地这样做:

m_oMyCS.setCallback([this](std::string const& arg){ executeMe(arg); });

无论哪种方式,我都将单个参数调用传递给setCallback()