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

2019-05-16  本文已影响0人  advanced_slowly

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

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

上一篇 下一篇

猜你喜欢

热点阅读