对模板参数推导感到困惑
Confused by template argument deduction
我创建了以下结构:
template<class T>
struct not_equals
{
not_equals(T d):data(d){};
bool operator()(T const & in)
{
return data != in;
}
T data;
};
我的期望是,由于我需要将一些具体类型 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
编译器无法识别模板参数类型的原因是什么?
c++17 将允许 class template deduction
到那时,您可以创建一个 "make" 函数:
template <class T> auto make_not_equals(const T& d) -> not_equals<T>
{
return {d};
}
auto z = make_not_equals('0');
这是 make 函数的 C++03 版本:
template <class T> not_equals<T> make_not_equals(const T& d)
{
return not_equals<T>(d);
}
不幸的是,当你声明一个变量时,你需要用模板拼写整个类型,因为缺少 auto
特性,但是 make 函数在推导上下文中仍然有用,例如参数:
template <class T> void foo(not_equals<T> ne);
void test()
{
foo(make_not_equals('0'));
}
我创建了以下结构:
template<class T>
struct not_equals
{
not_equals(T d):data(d){};
bool operator()(T const & in)
{
return data != in;
}
T data;
};
我的期望是,由于我需要将一些具体类型 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
编译器无法识别模板参数类型的原因是什么?
c++17 将允许 class template deduction
到那时,您可以创建一个 "make" 函数:
template <class T> auto make_not_equals(const T& d) -> not_equals<T>
{
return {d};
}
auto z = make_not_equals('0');
这是 make 函数的 C++03 版本:
template <class T> not_equals<T> make_not_equals(const T& d)
{
return not_equals<T>(d);
}
不幸的是,当你声明一个变量时,你需要用模板拼写整个类型,因为缺少 auto
特性,但是 make 函数在推导上下文中仍然有用,例如参数:
template <class T> void foo(not_equals<T> ne);
void test()
{
foo(make_not_equals('0'));
}