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

时间:2018-06-05 07:55:37

标签: templates c++17

在下面的示例代码中,我使用对象a0作为非类型模板参数,这很有效,因为它是一个具有链接(lvalue-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 个答案:

答案 0 :(得分:2)

绑定参考模板参数需要具有外部链接的对象的名称。单个数组元素在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>;