C++ 具有不同非类型模板参数的模板类部分专门化
是否可以使用不同的非类型模板参数值“部分专门化”模板类? 更具体地说,我尝试根据不同的非类型模板参数将std::vector和std::array的使用组合到一个类中,如下所示:C++ 具有不同非类型模板参数的模板类部分专门化,c++,templates,C++,Templates,是否可以使用不同的非类型模板参数值“部分专门化”模板类? 更具体地说,我尝试根据不同的非类型模板参数将std::vector和std::array的使用组合到一个类中,如下所示: template<typename T, int Size> //if Size given, use std::array stuff class MyArray:public std::array<T, Size> {...} template<typename T> //i
template<typename T, int Size> //if Size given, use std::array stuff
class MyArray:public std::array<T, Size> {...}
template<typename T> //if Size is not given, use std::vector stuff
class MyArray:public std::vector<T> {...}
template//如果给定了大小,请使用std::array stuff
类MyArray:public std::array{…}
模板//如果未给出大小,请使用std::vector stuff
类MyArray:public std::vector{…}
但第二个模板将是重新定义的模板错误。我尝试使用std::enable_if,但不知道如何在此处正确使用它。您可以使用sentinel值:
template<typename T, int Size = -1> //if Size given, use std::array stuff
class MyArray:public std::array<T, Size> {};
template<typename T> //if Size is not given, use std::vector stuff
class MyArray<T, -1>:public std::vector<T> {};
template//如果给定了大小,请使用std::array stuff
类MyArray:public std::array{};
模板//如果未给出大小,请使用std::vector stuff
类MyArray:public std::vector{};
演示:您可以使用sentinel值:
template<typename T, int Size = -1> //if Size given, use std::array stuff
class MyArray:public std::array<T, Size> {};
template<typename T> //if Size is not given, use std::vector stuff
class MyArray<T, -1>:public std::vector<T> {};
template//如果给定了大小,请使用std::array stuff
类MyArray:public std::array{};
模板//如果未给出大小,请使用std::vector stuff
类MyArray:public std::vector{};
演示:
你认为0的大小是有效的大小吗?您是否打算从std::array
派生模板?@SamVarshavchik您发现了问题。不,我没有。所以我想知道如何摆脱这种情况?@ SZ:你可以在第一个类定义中添加一个<代码> StistaSytStuts<代码>,以确保大小是你认为可以接受的值。我的方向与接受的答案相同。我正在考虑关于<代码>大小<代码> 0。你认为0的大小是有效的吗?尺寸?您是否打算从std::array
派生模板?@SamVarshavchik您发现了问题。不,我没有。所以我想知道如何摆脱这种情况?@ SZ:你可以在第一个类定义中添加一个<代码> StistaSytStuts<代码>,以确保大小是你认为可以接受的值。我的方向与接受的答案相同。我正在考虑关于<代码>大小<代码> 0。给出<代码>大小<代码>默认值-1
似乎很合适。@super:是的,我在你发表评论的同时修复了它。:)std::array
的第二个参数的类型为std::size\u t
。我建议将int
替换为std::size\u t
。请参阅声明。@Evg:同意,在编写此答案后,OP指定0不是其数组的有效元素数,因此我们确实可以使用size\u t和sentinel值0。为size
提供-1
的默认值似乎是合适的。@super:是的,我同时修复了您的评论。:)std::array
的第二个参数的类型为std::size\u t
。我建议将int
替换为std::size\u t
。请参阅声明。@Evg:同意,在写入此答案后,OP指定0不是其数组的有效元素数,因此我们确实可以使用size\u t和sentinel值0。