代码之家  ›  专栏  ›  技术社区  ›  oink

模板类型推断是否可以考虑基元操作类型转换?

  •  0
  • oink  · 技术社区  · 7 年前

    模板似乎无法类型推断原语操作的结果。例如,以下无法推断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++中,是否有某种方法可以让推理将这些信息考虑在内,而无需显式指定它?

    3 回复  |  直到 7 年前
        1
  •  5
  •   Brian Bi    7 年前

    调用函数时的模板参数推导不能深入函数体;它只是试图使函数的参数类型与参数类型相同,并且任何不能以这种方式推导的模板参数都保持不变。您需要一种基于函数体中返回语句的演绎形式。这是由提供的 auto 在C++14中:

    template<typename A, typename B>
    auto addNumbers(A x, B y){
        return x + y;
    }
    
        2
  •  1
  •   badola    7 年前

    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;
    }
    

    最好的部分 DECL类型 ,您几乎可以在其中编写任何表达式,它将在编译时进行计算。

    在上面的示例中,我们要求编译器声明函数的返回类型,与表达式的返回类型相同 x + y ,只需评估它们的类型。

    基于C++14的解决方案 (无需 DECL类型 ,使用编译器标志 -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
    
        3
  •  1
  •   Jive Dadson hmishra2250    7 年前

    函数重载推断,无论是否考虑模板,都不会也不能考虑返回类型。返回类型不是函数签名的一部分。演绎只考虑调用的参数是否与各种函数声明的参数匹配。以下将匹配任何A和B。如果 operator+ (A, B) 则返回类型将是它返回的任何类型。如果 操作员+(A、B) 如果未定义,编译器将抛出错误。

    template<typename A, typename B>
    auto addNumbers(A x, B y){
        return x + y;
    }
    int main(){
        addNumbers(1.0f, 1);
    }