c++tricks——非类型模板参数(nontype template parameters)

C++98???不确定)标准规定可以使用整型类型(integral type),指针(pointer)或者引用(reference)绑定模板类或模板函数的非类型模板形参,实参(argument)必须是常量表达式(constant expression, constexpr)即在编译期能够确定变量值。

不能把普通的局部(栈上)对象或者动态(堆上)对象绑定指针或引用的非类型形参, 可以使用全局类型进行绑定;

关于类模板(class template)中非类型模板参数的写法,参见: http://en.cppreference.com/w/cpp/language/class_template

#include <iostream>  

#include <vector>  

#include <cstring>  

using namespace std;

 

//整型模板  

template<unsigned N, unsigned M>

bool compare(const char(&p1)[N], const char(&p2)[M]) {

std::cout << "size : " << N << " " << M << std::endl;

return strcmp(p1, p2);

}

//指针  

template<const char* C>

void pointerT(const char* str){

std::cout << C << " " << str << std::endl;

}

//引用  

template<char(&ra)[9]> // 注:若类型不匹配编译会报错

void referenceT(const char* str){

std::cout << ra << " " << str << std::endl;

}

typedef void(*pfunc)(const char* c);

void func(const char* c) { std::cout << c << std::endl; }

 

template<pfunc pf>

void PointerF(char * str){

pf(str);

}

 

char ca[] = "Caroline"; //初始化指针  

char cr[9] = "Caroline"; //初始化引用, 包含一个结尾符号  

 

int main(void)

{

if (compare("Caroline", "Wendy")) {

std::cout << "Caroline is long." << std::endl;

}

else {

std::cout << "Wendy is long." << std::endl;

}

    char cb[] = "yanzheng\0";

//无法使用局部变量或者动态变量作为模板参数  

pointerT<ca>("test0"); //指针  

referenceT<cr>("test1"); //引用

PointerF<&func>("test2"); //函数指针

    /* pointerT<cb>("test0"); //编译失败 */

 

getchar();

return 0;

}

/* output

size : 9 6

Caroline is long.

Caroline test0

Caroline test1

test2

*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值