❥关于C++之泛型

Posted itzyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❥关于C++之泛型相关的知识,希望对你有一定的参考价值。

template <typename AnyType>
void Swap(AnyType &a, AnyType &b) 
    AnyType temp;
    temp = a;
    a = b;
    b = temp;

在早期没有typename关键字时,用class关键字,它们可互相通用。 

template<class T1, class T2>
void ft(T1 x, T2 y) 
    ...
    ?type? xpy = x + y;
    ...

xpy的类型是什么?如果是int+double,类型就是double;如果是int+int,类型就是int。

关键字decltype(C++11)

template<class T1, class T2>
void ft(T1 x, T2 y) 
    ...
    decltype(x + y) xpy = x + y;
    ...

如果需要多次声明,可结合使用typedef和decltype:

template<class T1, class T2>
void ft(T1 x, T2 y) 
    ...
    typedef decltype(x + y) XyType;
    XyType xpy = x + y;
    XyType arr[10];
    XyType & rxy = arr[2]; // rxy是一个引用
    ...

后置返回类型(C++11)

有一个相关的问题是decltype本身无法解决的。请看下面这个不完整的模板函数:

template<class T1, class T2>
?type? gt(T1 x, T2 y) 
    ...
    return x + y;

好像可以将返回类型设置为decltype ( x + y),但不幸的是,此时还未声明参数x和y,它们不在作用域内,必须在声明参数后才能使用decltype。为此,C++新增了一种声明和定义函数的语法。对于下面的原型:

double h(int x, float y);

新增的语法可编写成这样:

auto h(int x, float y) -> double; 
auto h(int x, float y) -> double
/* function body */;

通过结合使用这种语法和decltype,便可给gt()指定返回类型,如下所示:

template<class T1, class T2>
auto gt(T1 x, T2 y) -> decltype(x + y)

    ...
    return x + y;

以上是关于❥关于C++之泛型的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript专题之泛型

CLR类型设计之泛型

三层架构之泛型抽象

Java之泛型

泛型之泛型方法

java之泛型