C++模板实参推断

原创 2015年07月08日 22:25:19

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)    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&&








C++:模板实参推断及引用折叠

1.模板实参推断的概念对于函数模板和类模板,编译器利用调用中的实参函数来确定其模板参数。 从函数实参来确定模板实参的过程,称为模板实参推断。 模板实参的推断和常规的函数实参推断的规则不一样,尤其...

C++primer阅读笔记-模板与泛型编程(模板实参推断)

类型转换与模板类型参数 编译器利用调用中的函数实参来确定其模板参数 如果一个函数uxingcan的类型使用了模板类型参数,则采用特殊初始化规则 编译器通常不是对实参进行类型转换,而是生成一个新的模板实...

模板实参推断

对于函数模板,编译器利用调用中的函数实参来确定其模板参数。从函数实参来确定模板实参的过程被称为模板实参推断(template argument deduction)。在模板实参推断过程中,编译器使用函...
  • tengyft
  • tengyft
  • 2015年04月28日 09:59
  • 500

模板实参推断与函数指针的一些事

最近学了模板实参推断与函数指针的一些知识,觉得有些东西可以写下来与大家分享。这是我的第一篇博客,不足之处请大家指针O(∩_∩)O 首先上代码: #include #include usi...

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

模板实参推断过程中允许对函数实参进行的两种类型转换: (1) const 转换:可以将一个非const对象的引用(或指针)传递给一个const的引用(或指针)形参。 (2)数组或函数指针转换:如果...

两种必须使用显示模板实参的情形

显示模板实参:        模板实参被显示指定在逗号分隔的列表中,用尖括号( min(ui,1024) ;//显示指定了函数的参数类型是,1024是int类型,会转成 就函数模板而言,以下...

c++中模板类型的类型形参与实参的转换

在用实参调用模板函数的时候,一般不会转换实参以匹配已有的实例化,而是会通过模板函数产生新的实例以适应该实参。 例如:template int compare(const T& v1,const T...

C++基础——使用字符串作为函数模板的实参

在const char* s = "hello";s的类型是const char*,"hello"的类型是const char[6]是数组类型,也就是与"hell"(const char[5])具有不...

C++模板:实参演绎

在使用C++模板函数时,通过
  • zqxnum1
  • zqxnum1
  • 2014年11月23日 15:47
  • 649

C++实参求值顺序

  • 2012年12月20日 15:31
  • 200B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++模板实参推断
举报原因:
原因补充:

(最多只允许输入30个字)