美文网首页
模板类型推导

模板类型推导

作者: advanced_slowly | 来源:发表于2019-05-15 19:54 被阅读0次

理解函数模板类型推导:

一段函数模板的伪码大概是这样的:

template<typename   T>
 void f(ParamType   param);

调用这个函数会是这样:

f(expr);    //  用一些表达式来调用f

在编译的时候,编译器通过expr来进行推导出两个类型:一个是T的,另一个是ParamType。通常来说这些类型是不同的,因为 ParamType通常包含一些类型的装饰,比 如const或引用特性。注意T的类型不仅和expr的类型独立,而且和Param的形式独立。
下面是三个例子:
1.Param是一个指针(包括指向const的指针)或者一个引用(包括const引用)(但并不是一个通用引用或则说万能引用)

2.Param是一个通用引用
附universal reference:如果一个函数的template parameter有着T&&的格式,且有一个deduce type T.或者一个对 象被生命为auto&&,那么这个parameter或者object就是一个universal reference.

3.Param既不是指针,也不是引用

在第一种情况和第二种情况下,T和param类型推到中,调用函数的实参的const特性将给予保留。
1.第一种情况:

当Param是一个指针或者非通用的引用:在这种情况下类型推导的过程如下
-1. 如果 expr 的类型是个引用,忽略引用的部分。
-2. 然后利用 expr 的类型和 ParamType 对比去判断 T 的类型。

# include <iostream>

template <typename T>
void f(T& param)
{
    //param = 270;      //作为测试,这里假设param的数据类型支持赋值
    std::cout << param << std::endl;
}
int main()
{
    int x = 27;         //x是一个int
    const int y = x;    //y是一个const int
    const int& z = y;   //z是一个const int的引用

    //f(x);             //T是int,Param是int &
    //f(y);             //T是const int,Param是const int &
    f(z);               //T是const int,Param是const int &

    return 0;
}

2.第二种情况:

当Param是一个通用引用:如果expr是一个左值,那么T和Param都将被推导为左值引用。如果是右值,那么就遵循普通法则

# include <iostream>

template <typename T>
void f(T&& param)
{
    std::cout << param << std::endl;
}
int main()
{

    int x = 27;         //x是一个int
    const int y = x;    //y是一个const int
    const int& z = y;   //z是一个const int的引用

    f(x);               //T是一个int &,param是一个int &
    f(y);               //T是一个const int &,param是一个const int &
    f(z);               //T是一个const int &,param是一个const int &
    f(100);             //T是一个int,Param是一个int &&

    return 0;
}

3.第三种情况:

当Param既不是指针也不是一个引用:在这种情况下由于param既不是一个指针也不是一个引用,调用函数传递给形参param的是一个实参的副本。因此调用函数的实参的const特性将不被保留。其推导法则为:

-1.和之前一样,如果expr的类型是个引用,将会忽略引用的部分。
-2.如果在忽略 expr 的引用特性,expr是个const的,也要忽略掉 const。如果 是volatile,照样也要忽略掉(volatile对象并不常见)。

# include <iostream>

template <typename T>
void f(T param)
{
    param = 270;
    std::cout << param << std::endl;
}

int main()
{
    int x = 27;         //x是一个int
    const int y = x;    //y是一个const int
    const int& z = y;   //z是一个const int的引用

    f(x);               //T是一个int,Param是一个int 
    f(y);               //T是一个int,Param是一个int
    f(z);               //T是一个int,Param是一个int
    return 0;
}

理解auto模板类型推导

除了一个例外,auto模板类型推导就是函数模板类型推导。当一个变量被声明为auto,auto相当于模板中的T,而对变量做的相关的类型限定就像ParamType。这个例外是当使用c++11的语法使用花括号来初始化auto变量时:

auto a = {100};//此时a的类型被推导为std::intializer_list<int>

相关文章

  • Item 1Understand template type d

    引子 模板类型推导是Modern C++特性auto的基础,但模板类型推导和auto类型推导有一些区别,具体看正文...

  • Effective Modern C++ 系列之 条款1: 理

    Effective Modern C++ 系列之 条款1: 理解模板型别推导 1. CPP模板类型推导 函数模板一...

  • 模板类型推导

    理解函数模板类型推导: 一段函数模板的伪码大概是这样的: 调用这个函数会是这样: 在编译的时候,编译器通过expr...

  • Effective Modern C++ 学习笔记

    第一章:类型推导 item1:理解模板类型推导 考虑下面的函数模板 调用 编译器编译的时候要利用expr推导两个类...

  • C++学习:Effective Modern C++条款

    条款1:理解模板类型推导 推导模版类型时,引用的值视为非引用,即忽略引用。 推导通用引用类型参数时,左值特殊处理。...

  • C++ auto 类型推导

    C++ auto 类型推导规则与模板类型推导[https://www.jianshu.com/p/6490ea37...

  • effective modern C++笔记 第二章

    1. auto类型推导与模板类型推导的相同点 Type类型在包含auto的时候,本质上Type和ParamType...

  • Item 2 Understand auto type dedu

    引子 模板类型推导与auto类型推导是具有映射关系的。auto扮演T的角色,而类型限定符扮演ParamType的角...

  • 模板类型推导与auto

    本文聊聊C++中的模板类型推导和auto。两者其实是一样的,前者推导T的类型,后者推导auto的类型。本文初创于公...

  • 类型推导:函数模板与auto

    从函数模板谈起 函数模板的类型推导机制是在C++98时代就有的,auto的类型推导机制与其基本一致,所以先理解函数...

网友评论

      本文标题:模板类型推导

      本文链接:https://www.haomeiwen.com/subject/efapaqtx.html