C++11学习:auto和decltype

来源:互联网 发布:辐射4捏脸数据 黑寡妇 编辑:程序博客网 时间:2024/05/25 16:38

#include <iostream>/* C++03 style */template <typename R, typename T1, typename T2>R add(T1 t1, T2 t2){    std::cout << "C++03 style" << std::endl;    return(t1 + t2);}/* C++11 style *//* way 1 */template <typename T1, typename T2>auto add(T1 t1, T2 t2) ->decltype(t1 + t2){    std::cout << "C++11 style, way 1" << std::endl;    return(t1 + t2);}/* way 2 *//*template <typename T1, typename T2>decltype(*(T1*)0 * *(T2*)0) add(T1 t1, T2 t2){    std::cout << "C++11 style, way 2" << std::endl;    return(t1 + t2);}*//* way 3*//*template <typename T1, typename T2>decltype(std::declval<T1>() * std::declval<T2>()) add(T1 t1, T2 t2){    std::cout << "C++11 style, way 3" << std::endl;    return(t1 + t2);}*//* way 4 *//*template <typename T>struct DeclVal{    T operator () ();};template <typename T1, typename T2>decltype(DeclVal<T1>()() * DeclVal<T2>()()) add(T1 t1, T2 t2){    std::cout << "C++11 style, way 4" << std::endl;    return(t1 + t2);}*//* way 5 *//*template <typename T>T decl_val();template <typename T1, typename T2>decltype(decl_val<T1>() * decl_val<T2>()) add(T1 t1, T2 t2){    std::cout << "C++11 style, way 5" << std::endl;    return(t1 + t2);}*/int main(int argc, char * argv[]){    auto d = 0.0;    auto i = sizeof(d);    std::cout << "sizeof(0.0) = " << i << std::endl;    auto v1 = 5;    auto v2 = 3.8;    auto v3 = add(v1, v2);    decltype(v1 + v2) v4 = add(v1, v2);    auto v5 = add<double>(v1, v2);    std::cout << "v1 = " << v1 << std::endl;    std::cout << "v2 = " << v2 << std::endl;    std::cout << "v3 = " << v3 << std::endl;    std::cout << "v4 = " << v4 << std::endl;    std::cout << "v5 = " << v5 << std::endl;    return(0);}