簡體   English   中英

boost :: signal2使用enable_if綁定到純函數或成員函數

[英]boost::signal2 bind to pure or member function using enable_if

我目前正在嘗試實現一個類的成員函數,該成員函數允許設置本身是成員函數(可能是不同類的成員)或不屬於類的純函數的回調。

有了這樣的課程,

#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的成員的某種努力。 這是我嘗試的:

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'

不必為setCallback()設置不同的重載並嘗試解決不同的情況-只需提供一種:

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

用戶可以提供一個可以使用std::string const&調用的std::string const& 如果我希望它調用帶有單個參數的自由函數,則只需執行以下操作:

oCS.setCallback(noMemberExec);

如果我希望它在類實例上調用成員函數,則應明確地執行此操作:

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

無論哪種方式,我都將一個可調用的單參數傳遞給setCallback()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM