具有相关值的模板专业化
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 { ... };
你有几种可能性
直接在主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];
};
使用数组大小模板似乎很简单:
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 { ... };
你有几种可能性
直接在主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];
};