具有相关值的模板特化

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)

这可能吗?

Log*_*uff 5

您可以立即创建默认值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)

实例


Jar*_*d42 5

你有几种可能性

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)