C++函数模板非类型参数的使用介绍

C++编程语言中的模板应用是一个非常重要的应用技术,我们曾经通过多篇文章对此进行过详细的介绍。那么今天我们就先来了解一下有关C++函数模板非类型参数的一些基本概念,方便大家理解。
C++函数模板非类型参数主要用来为函数提供一个运算常量。关于非类型的函数模板参数,书中有下面的例子:
1. //函数模板定义 

2. template<typename T, int VAL>
3. T addValue(T const& x) 

4. { 
5. return x + VAL; 
6. } 
7. //其他代码 
8. //函数模板的使用 

9. std::transform(source.begin(), source.end(), dest.begin(), 

10. (int(*) (int const&))addValue<int, 5>);

上面的代码中定义了一个函数模板,目的是对传入的参数加上一个指定的int型的5。这样的函数被普遍的使用在对一组数据进行同一处理的场合。例如,12行。这里需要注意的是:一std::transform函数本身就是一个模板函数,它的最后一个参数可以传递一个函数指针。

因此,(int(*) (int const&))addValue<int, 5>其实是一个指向实例化后的addValue<T,
int
VAL>模板函数的指针。至于这个指针怎么读,还请高手指教。另外需要注意的一点是,std::transform的最后一个参数不一定要是模板函数,任何函数都可以(关于std::transform的正确理解参考下面的评论)。只是模板函数更合适处理多种类型的数据罢了。
C++函数模板非类型参数的限制。
关于非类型模板参数的限制目前记住它可以是常整型(包括枚举类型)和指向外部连接对象的指针就可以可了。由于历史原因,浮点型不能作为非类型模板的参数;而指针和字符串作为非类型模板的参数是有条件的。我想这与变量的作用范围和生命周期有关吧。书中后面会有比较相信的介绍,就等到时候再细看了。

#include <iostream>
using namespace std;

template <typename T1,typename T2=int>
class Test{
public:
    T1 NumNBei(T1 num,T2 N)
    {
        return num*N;
    }
};

template<typename T, int N> 
T ValueNBei(T const& x)  
{  
   return x * N;  
}  


void main()
{
  Test<double> t;
  double x=    t.NumNBei(2.3,2);
  cout<<x<<endl;
/*
4.6
Press any key to continue  
*/
  x=    ValueNBei<double,3>(2.3);
  cout<<x<<endl;
/*
 6.9
Press any key to continue
*/
  x=    ValueNBei<double,2>(2.3);
  cout<<x<<endl;
  
}

/*
vc6:
4.6
4.6
4.6
Press any key to continue

vs2010:
4.6
6.9
4.6
请按任意键继续. . .
*/

 

posted @ 2017-02-23 15:48  sky20080101  阅读(670)  评论(0)    收藏  举报