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

标签 c++ templates template-argument-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

我是不是漏掉了什么?
是否有任何解决方法来避免显式模板参数?

最佳答案

第二个参数类型不是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/

相关文章:

c++ - CRTP 静态多态性 : Using the Base Class to Call Derived Methods

c++ - 无法推断函数返回类型

c++ - 自动检测基类的类型参数

c++ - friend 类无法访问私有(private)数据

c++ - 为什么在 ctor 的参数列表中用 `x` 替换成员 `decltype(x)` 的类型会破坏类模板参数推导?

c++ - Boost 文件系统库中未解析的外部符号(错误 LNK2019)

c++ - 加速 C++ 练习 4-0

C++:调用模板类的非模板函数

c++ - 如何在 C++ 中修复 "Segmentation fault(core dump)"?

c++ - 在类中声明类型别名的替代方法