我需要覆盖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
我错过了什么吗? 可以有任何解决方法来避免显式模板参数吗?
答案 0 :(得分:1)
第二个参数类型不是std::function<T>
,而是一些绑定类型,因此编译器无法推导出第二个函数参数的T
。您需要告诉编译器“您可以在第二个函数参数中找不到T
的类型”。这可以通过使第二个参数成为非推导的上下文来完成。
template<typename T>
void bind(boost::signals2::signal<T> &signal,
typename std::common_type<boost::function<T>>::type function) {
// override code ...
}