0

私は現在、それ自体が(潜在的に異なるクラスの)メンバー関数であるか、クラスの一部ではない純粋な関数であるコールバックを設定できるクラスのメンバー関数を実装しようとしています。

このようなクラスを考えると、

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

次のような他のクラスのメンバー関数によって呼び出されます。

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

ここでの助けは大歓迎です!

PS: エラーで終了する VS 2015 を使用しています。

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

1 に答える 1