模板参数演绎困惑

Rev*_*ing 2 c++ templates c++03 argument-deduction

我创建了以下结构:

template<class T>
struct not_equals
{
  not_equals(T d):data(d){};
  bool operator()(T const & in)
  {
    return data != in;
  }
  T data;
};
Run Code Online (Sandbox Code Playgroud)

我的期望是,因为我需要将一些具体类型的值传递d 给构造函数,所以模板参数T将从类型中推导出来d.

但是,这不会发生.

not_equals('0'); // fails with 'missing template arguments'
char zero = '0';
not_equals(zero); // same as above
not_equals<char>('0'); // compiles without errors
Run Code Online (Sandbox Code Playgroud)

编译器无法识别模板参数类型的原因是什么?

bol*_*lov 5

c ++ 17将允许类模板推导

在此之前,您可以创建"make"功能:

template <class T> auto make_not_equals(const T& d) -> not_equals<T>
{
  return {d};
}
Run Code Online (Sandbox Code Playgroud)
auto z = make_not_equals('0');
Run Code Online (Sandbox Code Playgroud)

这是make函数的C++ 03版本:

template <class T> not_equals<T> make_not_equals(const T& d)
{
    return not_equals<T>(d);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当你声明一个变量时,你需要用模板拼写整个类型,因为缺少了auto特性,但make函数在推导的上下文中仍然有用,例如参数:

template <class T> void foo(not_equals<T> ne);
Run Code Online (Sandbox Code Playgroud)
void test()
{
   foo(make_not_equals('0'));
}
Run Code Online (Sandbox Code Playgroud)