C++模板编程


651 浏览 5 years, 4 months

2.10 替换函数语法(仅限C++11)

版权声明: 转载请注明出处 http://www.codingsoho.com/

替换函数语法(仅限C++11)

前面讨论了替换函数语法(Alternative Function Syntax),这里再一次提到的原因是这是一项可以和模板结合使用的非常有用的C++11特性。

替换函数语法解决的问题是:未必能在函数原型开头的时候就知道函数的精确返回类型。以下面的模板化函数为例:

template<typename Type1, typename Type2>
ReType myFunc(const Type1& t1, const Type2& t2) { return t1+t2; }

在这个例子中,RetType应该是表达式t1+t2的类型,而这个类型在这一行原型代码开头的地方是不知道的。只有在语义分析器到达了参数列表尾部的时候才能确定t1和t2的类型。

前面介绍了C++11的decltype特性。decltype(T)返回参数T的类型。根据这项特性,您可能想通过decltype特性解决之前的返回类型问题:

template<typename Type1, typename Type2>
decltype(t1+t2) myFunc(const Type1& t1, const Type2& t2) { return t1+t2; }

但在C++11中,这也是不合法的,因为编译器在解析decltype(t1+t2)的时候t1和t2还没有定义。

C++11通过替换函数语法解决了这个问题,如下所示。注意在这个新的语法中,返回类型是在参数列表之后指定的,因此在解析的时候参数的名称(以及参数的类型,因此也包括t1+t2类型)是已知的:

template<typename Type1, typename Type2>
auto myFunc(const Type1& t1, const Type2& t2)  -> decltype(t1+t2)
{ return t1+t2; }

这里的auto关键字告诉编译器这个原型使用的是替换函数语法,因此这个auto关键字的意义和前面介绍的意义完全不同,不是让编译器自动推导出表达式类型。

decltype用于模板参数推导
template <typename T1, typename T2>
decltype(x+y) add(T1 x, T2 y)
{}

Template <typename T1, typename T2>
auto add(T1 x, T2 y) -> decltype(x+y)
{}

在泛型编程中,返回值类型往往取决于表达式的计算 结果,而无法事先确定。