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

在《C++ Primer》第五版中,关于模版实参推断,讲述了如下内容

1.类型转换与模版类型参数

2.函数模版的显式实参

3.尾置返回类型

4.类型转换

5.函数指针和实参推断

6.模版参数推断和引用

书中留给大家一些习题,要求大家给出模版参数的推断类型,参见16.2.5节练习。问题是如何验证我们的答案是否正确,我在这里给出一段代码,抛砖引玉!

<span style="font-size:14px;">template <typename T>  void g(T&& val)
{

  if(is_lvalue_reference<T>::value)
  {
    if(is_const<typename remove_reference<T>::type>::value){cout<<"const left reference of "<<typeid(T).name()<<endl;}
    else{cout<<"left reference of "<<typeid(T).name()<<endl;}
  }
  else if(is_rvalue_reference<T>::value)
  {
    if(is_const<typename remove_reference<T>::type>::value){cout<<"const right reference of "<<typeid(T).name()<<endl;}
    else{cout<<"right reference of "<<typeid(T).name()<<endl;}
  }
  else cout<<typeid(T).name()<<endl;

}
//------------------------------------------------------------
</span><pre name="code" class="cpp"><span style="font-size:14px;">template <typename T>  void g(const T& val)
{

  if(is_lvalue_reference<T>::value)
  {
    if(is_const<typename remove_reference<T>::type>::value){cout<<"const left reference of "<<typeid(T).name()<<endl;}
    else{cout<<"left reference of "<<typeid(T).name()<<endl;}
  }
  else if(is_rvalue_reference<T>::value)
  {
    if(is_const<typename remove_reference<T>::type>::value){cout<<"const right reference of "<<typeid(T).name()<<endl;}
    else{cout<<"right reference of "<<typeid(T).name()<<endl;}
  }
  else cout<<typeid(T).name()<<endl;

}
//---------------------------------------------------------------
</span><pre name="code" class="cpp"><pre name="code" class="cpp"><span style="font-size:14px;">template <typename T>  void g(T val)
{

  if(is_lvalue_reference<T>::value)
  {
    if(is_const<typename remove_reference<T>::type>::value){cout<<"const left reference of "<<typeid(T).name()<<endl;}
    else{cout<<"left reference of "<<typeid(T).name()<<endl;}
  }
  else if(is_rvalue_reference<T>::value)
  {
    if(is_const<typename remove_reference<T>::type>::value){cout<<"const right reference of "<<typeid(T).name()<<endl;}
    else{cout<<"right reference of "<<typeid(T).name()<<endl;}
  }
  else cout<<typeid(T).name()<<endl;

}</span>



之后,我们可以用如下代码进行测试我们的猜测是否正确。

<span style="font-size:14px;">int main()
{
  double i=0;const double ci=i;
  g(i);
  g(ci);
  g(i*ci);
  g(i=ci);
  return 0;
}
</span>

关于更多的内容我就不照本宣科了,大家可以自己翻阅相关书籍。

时间: 2024-10-10 20:36:09

如何获得C++模版实参推断结果的相关文章

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

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

C++模板实参推断

1 类型转换与模板实参 1)自动转换的只有:const转换, 数组及函数到指针的转换 注:不同大小相同元素类型是不同的类型 2)相同模板参数名对应的实参类型必须相同 3)不同模板参数名对应的实参类型可以不同,但必须兼容 2 函数模板的返回值问题 函数模板只会对函数参数列表的类型进行推断不会对返回值推断 解决方法: 1) 显示模板参数 注: 显示指定了模板类型参数在类型转换上和普通函数参数一样 template <typename T1, typename T2, typename T3> T1

字符串作为函数模版实参的意外情况

有时,当把c风格的不同字符串去实例化函数模版的同一个模版参数时,在实参演绎的过程中经常会发生 意想不到的事情,那就是编译失败,并报错类型不匹配. 正如下面的例子一样: #include<iostream> using namespace std; /* *匹配测试 */ template<typename T> int ref_fun(T & t1,T & t2) { return strlen(t1) - strlen(t2); } template<typ

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

当函数模版遇上函数重载

demo 1 #include <iostream> using namespace std; //让 类型参数化 ===, 方便程序员进行编码 // 泛型编程 //template 告诉C++编译器 我要开始泛型编程了 .看到T, 不要随便报错 template <typename T> void myswap(T &a, T &b) { T c = 0; c = a; a = b; b = c; cout << "hello ....我是模

[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