boost::signal2 使用 enable_if 绑定到纯函数或成员函数
boost::signal2 bind to pure or member function using enable_if
我目前正在尝试实现一个 class 的成员函数,它允许设置一个回调,它本身是一个成员函数(可能是不同的 class)或一个纯函数不是作为 class.
的一部分
鉴于这样 class,
#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));
}
}
被其他 classes 的成员函数这样调用:
#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'
不要为 setCallback()
设置不同的重载并尝试考虑不同的情况 - 只需提供一个:
template <class F>
void setCallback(F f)
{
m_oCallback.connect(f);
}
只需要用户提供一个可以用std::string const&
调用的函数。如果我想让它调用一个接受单个参数的自由函数,我就这样做:
oCS.setCallback(noMemberExec);
如果我想让它在 class 实例上调用成员函数,我会明确地这样做:
m_oMyCS.setCallback([this](std::string const& arg){ executeMe(arg); });
无论哪种方式,我都将一个可调用的单参数传递给 setCallback()
。
我目前正在尝试实现一个 class 的成员函数,它允许设置一个回调,它本身是一个成员函数(可能是不同的 class)或一个纯函数不是作为 class.
的一部分鉴于这样 class,
#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));
}
}
被其他 classes 的成员函数这样调用:
#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'
不要为 setCallback()
设置不同的重载并尝试考虑不同的情况 - 只需提供一个:
template <class F>
void setCallback(F f)
{
m_oCallback.connect(f);
}
只需要用户提供一个可以用std::string const&
调用的函数。如果我想让它调用一个接受单个参数的自由函数,我就这样做:
oCS.setCallback(noMemberExec);
如果我想让它在 class 实例上调用成员函数,我会明确地这样做:
m_oMyCS.setCallback([this](std::string const& arg){ executeMe(arg); });
无论哪种方式,我都将一个可调用的单参数传递给 setCallback()
。