将回调绑定到模板化对象
Binding callback to a templated object
我有一个包含回调的模板化 class,存储为 std::function
typedef std::function<void()> func_t;
template<typename T>
struct A
{
T someMember;
func_t callback;
};
此回调由某种机制 (boost::asio) 调用,我想传递参数,因此绑定它们:
例如:
void a_callback( int v )
{
std::cout << "value=" << v << "\n";
}
然后我以这种方式将其存储在对象中。
enum EN { ONE, TWO };
int main()
{
A<EN> a;
a.callback = boost::bind( a_callback, 42); // ok
a.callback(); // ok
}
到目前为止,一切都很好。
但现在我想将对象本身传递给回调函数,以便它可以在其上做事。回调变为模板化,因为对象 class 是:
template<typename T>
void b_callback( A<T>& b, int v )
{
std::cout << "value=" << v << "\n";
}
但尝试绑定失败:
int main()
{
A<EN> a2;
a2.callback = boost::bind( b_callback, a2, 42);
}
铿锵声说:
error: no matching function for call to 'bind'
a2.callback = boost::bind( b_callback, a2, 42); // build error
/usr/local/include/boost/bind/bind.hpp:1891:5: note: candidate template ignored: couldn't infer template argument 'R'
BOOST_BIND(F f, A1 a1, A2 a2)
/usr/local/include/boost/bind/bind.hpp:1868:20: note: expanded from macro 'BOOST_BIND'
#define BOOST_BIND bind
我做错了什么?我该如何管理?
您需要实例化一个具有具体类型的函数模板EN
:
a2.callback = boost::bind(&b_callback<EN>, a2, 42);
因为b_callback
是函数模板,不是函数。
我有一个包含回调的模板化 class,存储为 std::function
typedef std::function<void()> func_t;
template<typename T>
struct A
{
T someMember;
func_t callback;
};
此回调由某种机制 (boost::asio) 调用,我想传递参数,因此绑定它们:
例如:
void a_callback( int v )
{
std::cout << "value=" << v << "\n";
}
然后我以这种方式将其存储在对象中。
enum EN { ONE, TWO };
int main()
{
A<EN> a;
a.callback = boost::bind( a_callback, 42); // ok
a.callback(); // ok
}
到目前为止,一切都很好。
但现在我想将对象本身传递给回调函数,以便它可以在其上做事。回调变为模板化,因为对象 class 是:
template<typename T>
void b_callback( A<T>& b, int v )
{
std::cout << "value=" << v << "\n";
}
但尝试绑定失败:
int main()
{
A<EN> a2;
a2.callback = boost::bind( b_callback, a2, 42);
}
铿锵声说:
error: no matching function for call to 'bind'
a2.callback = boost::bind( b_callback, a2, 42); // build error
/usr/local/include/boost/bind/bind.hpp:1891:5: note: candidate template ignored: couldn't infer template argument 'R'
BOOST_BIND(F f, A1 a1, A2 a2)
/usr/local/include/boost/bind/bind.hpp:1868:20: note: expanded from macro 'BOOST_BIND'
#define BOOST_BIND bind
我做错了什么?我该如何管理?
您需要实例化一个具有具体类型的函数模板EN
:
a2.callback = boost::bind(&b_callback<EN>, a2, 42);
因为b_callback
是函数模板,不是函数。