3

使用模板来确定数组大小似乎很简单:

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 时如何将 N 设置为 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;

这可能吗?

4

2 回答 2

5

您可以N立即设置默认值,就像使用普通函数参数一样:

enum MyEnum { Hi, Lo };

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

活生生的例子

于 2016-01-03T01:30:38.840 回答
5

你有几种可能

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];
};
于 2016-01-03T01:56:32.437 回答