CAN模板类型推理考虑原始操作类型转换



模板似乎无法键入原始操作的结果。例如,以下未能推断出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);
}

最新更新