模板似乎无法键入原始操作的结果。例如,以下未能推断出R:
template<typename A, typename B, typename R>
R addNumbers(A x, B y){
return x + y;
}
main(){
addNumbers(1.0f, 1);
}
即使很明显float + int = float
。
在任何版本的C 中,是否有某种方法可以将这些信息考虑到而无明确指定的推断?
模板参数扣除时,呼叫函数时无法注视函数的主体;它只是试图使函数的参数类型与参数类型相同,而无法推导这种方式的任何模板参数都不会固定。您需要一种基于功能正文中的返回语句的推论形式。这由auto
在C 14中提供:
template<typename A, typename B>
auto addNumbers(A x, B y){
return x + y;
}
decltype
是C 11中最好的添加之一。阅读更多有关它的信息:http://en.cppreference.com/w/cpp/language/decltype
C 11的解决方案(使用编译器标志-std=c++11
(
template<typename A, typename B>
auto addNumbers(A const & x, B const & y) -> decltype(x + y)
{
return x + y;
}
decltype
最好的部分,您几乎可以在其中写入任何表达式,并且将在编译时进行评估。
在上面的示例中,我们要求编译器通过评估其类型来声明函数的返回类型,与表达式x + y
的返回型相同。
C 14的解决方案(不需要decltype
,使用Compiler Flag -std=c++14
(
template<typename A, typename B>
auto addNumbers(A const & x, B const & y)
{
return x + y;
}
用法:
auto ans = addNumbers(1.0f, 1); // ans is deduced to be float
功能过载扣除额,无论是否考虑模板,都不会并且不能考虑返回类型。返回型不是函数签名的一部分。扣除仅考虑呼叫的参数是否匹配各种函数声明的参数。以下将匹配任何A和A。如果定义了operator+ (A, B)
,则返回类型将是返回的任何内容。如果未定义operator+ (A, B)
,则编译器将丢弃错误。
template<typename A, typename B>
auto addNumbers(A x, B y){
return x + y;
}
int main(){
addNumbers(1.0f, 1);
}