【问题标题】:Template specialization with dependent values具有依赖值的模板特化
【发布时间】:2016-04-06 23:06:04
【问题描述】:

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

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;

这可能吗?

【问题讨论】:

    标签: c++ templates class-template


    【解决方案1】:

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

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

    Live example

    【讨论】:

    • 请注意,允许MyArray&lt;Hi, 42&gt;(这可能是一种奖励,也可能是一种不受欢迎的行为)...
    【解决方案2】:

    你有几种可能

    直接在主类中使用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];
    };
    

    【讨论】:

    • 您应该注意,在您的第一个选项中,constexpr 仅适用于 C++11
    • @BrettStottlemyer:我们现在是 2016 年,所以我想说如果需要 c++03,应该在 Q 中提及。在 C++03 中,您可以使用 enum技巧而不是 constexpr 这里。而对于第二个选项,integral_constant(也是 C++11)可以在 C++03 中实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多