具有相关值的模板专业化

Template specialization with dependent values

使用数组大小​​模板似乎很简单:

template <size_t N>
struct MyArray
{
    char array[N];
};

不过,我想做的是根据其他设置数组大小:

enum MyEnum {Hi, Lo};

template <MyEnum T, size_t N>
struct MyArray
{
    MyEnum type() { return T; }
    char array[N];
};

如何在 MyEnum 为 Hi 时设置 N 为 10,当 MyEnum 为 Lo 时设置为 200?

我想说的是

MyArray<Lo> lo; // Result in MyArray<Lo, 200>
MyArray<Hi> hi; // Result in MyArray<Hi, 10>

而不是说

MyArray<Lo, 200> lo;
MyArray<Hi, 10> hi;

这可能吗?

您可以立即为 N 设置默认值,就像您对普通函数参数所做的那样:

enum MyEnum { Hi, Lo };

template <MyEnum T, size_t N = (T == Hi ? 10 : 200)> // parentheses for clarity
struct MyArray { ... };

Live example

你有几种可能性

直接在主class中使用N的计算:

template <MyEnum E>
class MyArray
{
    constexpr std::size_t N = (E == Hi ? 10 : 200);
public:
    MyEnum type() { return E; }
    char array[N];
};

或专攻

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];
};