【C++模板】非类型模板参数-创新互联
目录
什么是非类型模板参数?
网页标题:【C++模板】非类型模板参数-创新互联
标题网址:http://myzitong.com/article/coocid.html
- 什么是非类型模板参数?
- 非类型的类模板参数
- 非类型的函数模板参数
- 非类型模板参数的局限性
- 限制使用的场景
- 支持使用的场景
什么是非类型模板参数?
非类型的类模板参数在函数模板和类模板中,模板参数并不仅仅可以当作类型,还可以当作普通值。当使用普通值作为模板参数时,调用者就必须显式的指定这些值。
例如 设置一个固定长度的列表MyList
。且模板参数有 数据类型和容量大小。
只有在增加新的元素时才会与容器大小进行比较。第二个模板参数就是非类型的类模板参数。
具体代码如下:
templateclass MyList
{MyList();
void PushBack();
void PopFront();
private:
list m_data;
uint32_t m_size;
};
templateMyList::MyList()
:m_size{0}
{}
templatevoid MyList::PushBack()
{if (m_size >= SIZE)
{throw out_of_range("MyList<>::PushBack() list is full! ");
}
// ... 功能代码
}
templatevoid MyList::PopFront()
{// ... 功能代码
}
非类型的函数模板参数同样函数模板也支持非类型的模板参数。例如配合C++的算法库algorithm
中的std::transform
方法进行全部元素增加。
#include#include
#includeusing namespace std;
templateT addValue(T const& x)
{return x + VAL;
}
int main()
{vectorvec{9,5,1,2,3,4 };
transform(vec.begin(), vec.end(), vec.begin(), addValue);
for (const auto& elem : vec)
{cout<< elem<< " ";
}
cout<< endl;
return 0;
}
函数模板当作回调函数使用时,就需要显式的指定函数模板参数类型。
非类型模板参数的局限性非类型模板参数也是有要求的,不是所有的类型都支持。
限制使用的场景- 浮点数不允许作为非类型模板参数
虽然提示使用C++20标准,但20也不支持。 - 类对象不允许作为非类型模板参数
- 字符串常量不允许作为非类型模板参数
- 全局指针不允许作为非类型模板参数
- 常量整数
- 枚举值
- 对象指针
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页标题:【C++模板】非类型模板参数-创新互联
标题网址:http://myzitong.com/article/coocid.html