代码之家  ›  专栏  ›  技术社区  ›  wimalopaan

使用数组元素作为非类型模板参数?

  •  2
  • wimalopaan  · 技术社区  · 6 年前

    在下面的示例代码中,我使用对象a0作为非类型模板参数,这很好,因为它是一个具有链接的对象(左值ref)。所以我想一定可以用数组元素来实现,但是失败了:

    constexpr uint8_t a[10] = {};
    constexpr uint8_t a0 = {};
    
    template<typename T, const T& V>
    struct Test {};
    
    using test = Test<uint8_t, a0>; // OK
    using test = Test<uint8_t, a[0]>; //NOK
    

    有办法让它工作吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Maxim Egorushkin    6 年前

    绑定引用模板参数需要具有外部链接的对象的名称。单个数组元素在C++中没有名称,也没有链接。这就是引用模板参数不能绑定到数组元素的原因。见 6.5 Program and linkage [basic.link] 详细情况。

    如果删除引用(如果可能),可以将其编译为:

    template<typename T, T V>
    struct Test {};
    

    或者通过模板内的索引访问元素:

    template<class T, T const& A, size_t Idx>
    struct Test2 {
        static constexpr decltype(A[Idx]) element = A[Idx];
        static_assert(std::is_reference<decltype(element)>::value, "");
    };
    
    using test = Test2<decltype(a), a, 1>;