Bre*_*yer 3 c++ templates class-template
使用数组大小的模板似乎很简单:
template <size_t N>
struct MyArray
{
char array[N];
};
Run Code Online (Sandbox Code Playgroud)
但是,我想要做的是根据其他内容设置数组大小:
enum MyEnum {Hi, Lo};
template <MyEnum T, size_t N>
struct MyArray
{
MyEnum type() { return T; }
char array[N];
};
Run Code Online (Sandbox Code Playgroud)
当MyEnum为Hi时如何将N设置为10,当MyEnum为Lo时如何设置为200?
我想做的就是说
MyArray<Lo> lo; // Result in MyArray<Lo, 200>
MyArray<Hi> hi; // Result in MyArray<Hi, 10>
Run Code Online (Sandbox Code Playgroud)
而不是说
MyArray<Lo, 200> lo;
MyArray<Hi, 10> hi;
Run Code Online (Sandbox Code Playgroud)
这可能吗?
您可以立即创建默认值N,与使用普通函数参数一样:
enum MyEnum { Hi, Lo };
template <MyEnum T, size_t N = (T == Hi ? 10 : 200)> // parentheses for clarity
struct MyArray { ... };
Run Code Online (Sandbox Code Playgroud)
你有几种可能性
N直接在主类中使用计算:
template <MyEnum E>
class MyArray
{
constexpr std::size_t N = (E == Hi ? 10 : 200);
public:
MyEnum type() { return E; }
char array[N];
};
Run Code Online (Sandbox Code Playgroud)
或专门化
template <MyEnum E> struct MyArraySize;
template <> struct MyArraySize<Hi> : std::integral_constant<std::size_t, 10> {};
template <> struct MyArraySize<Low> : std::integral_constant<std::size_t, 200>{};
template <MyEnum E>
class MyArray
{
public:
MyEnum type() { return E; }
char array[MyArraySize<E>::value];
};
Run Code Online (Sandbox Code Playgroud)