C ++模板参数推导不起作用

时间:2012-07-06 22:02:08

标签: c++ templates template-deduction boost-function boost-signals2

我需要覆盖boost::signals2::signalboost::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

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

1 个答案:

答案 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 ...
}