美文网首页
函数模板类型推导中的特例

函数模板类型推导中的特例

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

1.函数模板类型推导中的特例

当函数模板中的参数param既不是引用也不是指针时,传递给模板函数的按值传递的数组参数会被退化为指针类型,这是合乎情理的

# include <iostream>

//由于数组退化成指针,所以调用此函数的实参类型const char *,依据模板
//类型推导的第三种情况,此时param类型为const char *
template <typename T>
void f(T param)
{
    std::cout << param << std::endl;    
}

int main()
{
    char arr[] = "HelloWorld";

    f(arr);

    return 0;
}

这不难理解,但当函数模板中的参数为param为引用当如何呢?在下面例子中就是今天说明的函数模板的类型推导中的一个特例,如下函数模板形式参数的类型为const char(&)[13]或者const char[13]&即数组的引用

# include <iostream>

template <typename T>
void print(const T & arr)
{
    std::cout << &arr << std::endl;//005AF974
    std::cout << arr[2] << std::endl;//l
}

int main()
{
    const char arr[] = "I lova china";

    std::cout << &arr << std::endl;//005AF974

    print(arr);

    return 0;
}

2.数组引用做函数模板参数的一个简单例子

/*
# include <iostream>
# include <array>

//  在编译的时候返回数组的长度(数组引用参数没有名字, 
//  因为只关心数组包含的元素的个数)
template<typename   T,  std::size_t N> 
constexpr   std::size_t arraySize(T (&)[N]  )   noexcept
{               
    return  N;          
}


int main()
{
    int arr []= {1,2,3,4,5,6};

    std::array<int, arraySize(arr)> dyArray{100,200,300,400,500,600};

    for (int x : dyArray)
    {
        std::cout << x << std::endl;
    }
    return 0;
}

我们再来看一个简单的例子来理解数组引用类型做函数参数。

#include <iostream>

using namespace std;

void printArr(const char (&arr)[11])    //char (&)[11]即为数组的引用类型
{
    cout << sizeof(arr) << endl;    //11
}

void printArr1(const char arr[])
{
    cout << sizeof(arr) << endl;    //4
}
int main()
{
    char arr[] = "HelloWorld";
    cout << sizeof(arr) << endl;    //11
    printArr(arr);
    printArr1(arr);
    return 0;
}

当然,当函数模板的泛化形参类型声明是一个引用但不是通用引用时,如果调用该函数时,实参是函数名,则该形参被推导为函数指针的引用。

相关文章

  • 函数模板类型推导中的特例

    1.函数模板类型推导中的特例 当函数模板中的参数param既不是引用也不是指针时,传递给模板函数的按值传递的数组参...

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

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

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

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

  • Effective Modern C++ 学习笔记

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

  • C++模板编程/泛型编程

    模板分类 模板分为函数模板与类模板两类。 函数模板 模板声明 模板定义 例如 函数模板实参类型不一致问题 参数推导...

  • C++14

    Lambda 函数constexpr类型推导二进制常量变量模板

  • TMP(2)

    深入模板原理 函数模板,类模板的实参推导 函数模板的实参推导函数模板的实参推导是发生在名字查找之后,和重载决议之前...

  • Item 1Understand template type d

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

  • C++模板系列1-基础

    函数模板 如下面的函数模板参数: 其中,T1,T2,T3三个类型,只有出现在函数形参中的参数可以被编译器自动推导出...

  • 模板类型推导

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

网友评论

      本文标题:函数模板类型推导中的特例

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