对于函数模板,返回类型推断则是意外的惊喜。有一个或多个类型参数的模板函数的返回类型可能依赖于用来实例化模板的类型。从下面的这个例子可以看到这一点:
template <typename T1, typename T2>
??? larger(T1 a, T2 b)
{
return a > b ? a : b;
}
很难指定这里应该返回哪个类型。但是,有一种简单的方法让编译器在实例化模板后推断出返回类型:
template <typename T1, typename T2>
auto large(T1 a, T2 b)
{
return a > b ? a : b;
}
有了这个定义,下面的语句就可以编译,而不需要显式指定任何类型实参:
int small_int {10};
std::cout << "Larger of " << small_int << " and 9.6 is"
<< larger(small_int, 9.6) << std::endl; //deduced return type: double
std::string a_string {"A"};
std::cout << "Larger of \"" << a_string << "\" and \"Z\" is \""
<< larger(a_string, "Z") << '"' << std::endl; //deduced return type: std::string