我需要覆盖 boost::signals2::signal
和 boost::function
之间的连接。
为此,我创建了以下模板函数:
template<typename T>
void bind(boost::signals2::signal<T> &signal, boost::function<T> function) {
// override code ...
}
我想尽可能简单地使用这个bind
。
从我在类似问题的帖子中读到的内容来看,模板参数应该从函数参数中推导出来。
但在我的例子中,当没有明确的参数时它不起作用。
boost::signals2::signal<void ()> my_signal;
bind<void ()>(my_signal, boost::bind(&A::func, this)); // this works
bind(my_signal, boost::bind(&A::func, this)); // error: no matching function for call
我是不是漏掉了什么?
是否有任何解决方法来避免显式模板参数?
最佳答案
第二个参数类型不是std::function<T>
, 但一些绑定(bind)类型,所以编译器无法推断出 T
对于第二个函数参数。您需要告诉编译器“您可以在第二个函数参数中找不到 T
的类型”。这可以通过使第二个参数成为非推导上下文来完成。
template<typename T>
void bind(boost::signals2::signal<T> &signal,
typename std::common_type<boost::function<T>>::type function) {
// override code ...
}
关于C++ 模板参数推导不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11370242/