C++模板实参推断

1 类型转换与模板实参

1)自动转换的只有:const转换, 数组及函数到指针的转换

注:不同大小相同元素类型是不同的类型

2)相同模板参数名对应的实参类型必须相同

3)不同模板参数名对应的实参类型可以不同,但必须兼容

2 函数模板的返回值问题

函数模板只会对函数参数列表的类型进行推断不会对返回值推断

解决方法:

1) 显示模板参数

注: 显示指定了模板类型参数在类型转换上和普通函数参数一样

template <typename T1, typename T2, typename T3>

T1 alternative_sum(T2, T3)

------------------------------------------------------------------------------

auto v = alternative_sum<int>(i, j);

v为int

2) 尾置返回类型

template <typename It>

auto fcn(It first, It larst) -> decltype(*first)

{

return *first;

}

注:对迭代器的decltype运算符返回的只能是对象的引用,不能是值.

可以借助remove_reference<decltype(*first)>::type

3 函数指针与实参推断

程序上下文必须满足:对每个模板参数能唯一确定起类型或值

4 引用与模板实参推断

1) 左值引用

T& ---> 实参必须是一个左值

f1(i)   i(int)                T int

f1(ci)  ci (const int)   T const int

f1(5) 错误,不是左值

const T& ---> 实参可以是对象(const或非const), 临时对象, 或字面值常量

注:当函数实参是const时, T将不是const类型

f2(i)   i(int)                T int

f2(ci)  ci (const int)   T  int

f2(5) 错误,不是左值   T int

注: const参数可以绑定到一个右值

2) 右值引用

T&&

------出入实参               T

左值 左值引用

右值 对象类型

左值引用
左值引用

右值引用 右值引用

引用折叠只能用于间接创建的引用的引用.

右指引用的常用用途:1) 模板转发, 模板重载

5 std::move原理

template <typename T>

typename remove_reference<T>::type&& move(T&& t){

reurn static_cast<typename remove_reference<T>::type&&>(t);

}

注:将一个左值static_cast转到一个右值引用是允许的.

6 转发std::forward

forward<T> 返回类型是T&&

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 21:31:47

C++模板实参推断的相关文章

C++ primer-&gt;16.2 模板实参推断

一.类型转换与模板类型参数 1.如果一个函数形参的类型使用了模板类型参数,那么它采用特殊的初始化规则.只有很有限的几种类型转换会自动地应用于这些实参. ①.顶层const无论是在形参中还是在实参中,都会被忽略. ②.const转换:可以将一个非const对象的引用(或指针)传递给一个const的引用(或指针)形参. ③.数组或函数指针转换:如果函数形参不是引用类型,则可以将对数组或函数类型的实参应用于正常的指针转换. 如下程序所示: 1 template<typename T> T fobj(

【C++ Primer 第16章】2. 模板实参推断

模板实参推断:对于函数模板,编译器利用调用中的函数实参来确定模板参数,从函数实参来确定模板参数的过程被称为模板实参推断. 类型转换与模板类型参数 与往常一样,顶层const无论在形参中还是在是实参中,都被会忽略. • const转换:可以将一个非const对象的引用(或指针)传递给const的引用(或指针)形参. • 数组或函数指针转换:一个数组实参可以转换为一个指向其首元素的指针.类似的,一个函数实参可以抓转换一个该函数类型的指针. 1 template <typename T> T fob

模板与泛型编程——模板实参推断

一.模板实参推断 对于函数模板,编译器利用调用中的函数实参来确定其模板参数.从函数实参来确定模板实参的过程被称为模板实参推断.在模板实参推断过程中,编译器使用函数调用中的实参类型来寻找模板实参,用这些模板实参生成的函数与给定的函数调用最为匹配. 1.类型转换与模板类型参数 与非模板函数一样,我们在一次调用中传递给函数模板的实参被用来初始化函数的形参.如果一个函数形参的类型使用了模板类型参数,那么它采用特殊的初始化规则.只有很有限的几种类型转换会自动地应用于这些实参.编译器通常不是对实参进行类型转

C++学习笔记(4)----模板实参推断

1. 如图所示代码,模板函数 compare(const T&, const T&) 要求两个参数类型要一样. compare("bye","dad") 调用,将模板参数推断为 const char[4] (因为还有一个 NULL 字符串结尾),而且两个参数都为 const char[4],所以可以正常实例化模板函数. 而 compare("hi","world") 调用,将两个模板参数本别推断为 const

[014]模板-模板实参推导

对于函数模板,编译器利用调用中的函数实参来确定其函数模板,从函数实参来确定模板实参的过程就被叫做是模板实参推导. 比如: 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 template <class T> 6 int compare(const T &v1, const T &v2) { 7 if (v1 > v2) { 8 cout << &quo

[Effective Modern C++] Item 1. Understand template type deduction - 了解模板类型推断

条款一 了解模板类型推断 基本情况 首先定义函数模板和函数调用的形式如下,在编译期间,编译器推断T和ParamType的类型,两者基本不相同,因为ParamType常常包含const.引用等修饰符 template<typename T> void f(ParamType param); // 函数模板形式 f(expr); // 函数调用 存在T的类型即为expr类型的情况,如下T为int templat<typename T> void f(const T& param

现代C++之理解模板类型推断(template type deduction)

理解模板类型推断(template type deduction) 我们往往不能理解一个复杂的系统是如何运作的,但是却知道这个系统能够做什么.C++的模板类型推断便是如此,把参数传递到模板函数往往能让程序员得到满意的结果,但是却不能够比较清晰的描述其中的推断过程.模板类型推断是现代C++中被广泛使用的关键字auto的基础.当在auto上下文中使用模板类型推断的时候,它不会像应用在模板中那么直观,所以理解模板类型推断是如何在auto中运作的就很重要了. 下面将详细讨论.看下面的伪代码: templ

如何验证模版实参推断结果

在<C++ Primer>第五版中,关于模版实参推断,讲述了如下内容 1.类型转换与模版类型参数 2.函数模版的显式实参 3.尾置返回类型 4.类型转换 5.函数指针和实参推断 6.模版参数推断和引用 书中留给大家一些习题,要求大家给出模版参数的推断类型,参见16.2.5节练习.问题是如何验证我们的答案是否正确,我在这里给出一段代码,抛砖引玉! template <typename T> void g(T&& val) { if(is_lvalue_referenc

如何获得C++模版实参推断结果

在<C++ Primer>第五版中,关于模版实参推断,讲述了如下内容 1.类型转换与模版类型参数 2.函数模版的显式实参 3.尾置返回类型 4.类型转换 5.函数指针和实参推断 6.模版参数推断和引用 书中留给大家一些习题,要求大家给出模版参数的推断类型,参见16.2.5节练习.问题是如何验证我们的答案是否正确,我在这里给出一段代码,抛砖引玉! <span style="font-size:14px;">template <typename T> v