c++ - 构造函数的部分模板特化
问题描述
我需要一个看起来像这样的类:
template<typename T, class S, size_t C>
class myClass
{
public:
myClass(); // Ctor
/*
*/
private:
S myData;
}
其中 T 是存储数据的类型,S 是容器类型,C 是它的大小。方法将不依赖于容器类型,但我仍然需要正确初始化 S。例如,让 S be std::vector
,我尝试过:
template<typename T, size_t C>
myClass<T, std::vector<T>, C>::myClass()
{
}
但我得到E0040 expected identifier
错误。
解决方案
您不能部分专门化一个方法,您可以部分专门化整个类,但需要一些重复。
由于您可以使用 C++17,因此您可以调整实现:
template<typename T, class S, size_t C>
myClass<T, S, C>::myClass()
{
if constexpr (std::is_same_v<S, std::vector<T>>) {
// special case
} else {
// regular case
}
}
在另一个选项(C++ 17 之前)中标记 dipatching,其优点是允许成员初始化器列表:
template <typename T> struct tag{};
template <typename T, class S, size_t C>
class myClass
{
private:
myClass(tag<std::vector<T>>) : myData(/*special case */) {/* special case */}
template <typename U>
myClass(tag<U>) : myData(/*regular case */) {/* regular case */}
public:
myClass() : myClass(tag<S>{}) {}
private:
S myData;
};
推荐阅读
- bash - Bash:在后台安装多个 npm 会给出错误,“设备上没有剩余空间”
- sql - 使用此特定过滤器时,什么可能导致我的 T-SQL 查询输出不连贯?
- node.js - 机器人在某个频道发送消息
- c# - 在 C# 的内存中理想地将 SVG 字符串转换为位图
- aws-lambda - 如何使用 DynamoDB 调用单个项目?
- python - 提取抓取的 BeautifulSoap HTML 数据
- php - form_row(form.form, 'attr':{'value':var}) 中的 Twig 变量
- angular - 导出为 pdf 时排除最后一列 - Angular 6 Kendo
- c# - 如何使用 StreamWriter 在文本中添加行?
- java - HTML 到 MD java 解析异常