3

我需要覆盖 和 之间的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

我错过了什么吗?
是否有任何解决方法可以避免显式模板参数?

4

1 回答 1

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 ...
}
于 2012-07-08T10:20:08.053 回答