Использование элементов массива в качестве нетиповых параметров шаблона? - PullRequest
0 голосов
/ 05 июня 2018

В следующем примере кода я использую объект 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 голосов
/ 05 июня 2018

Для привязки параметра шаблона ссылки требуется имя объекта с внешней связью.Отдельные элементы массива не имеют имени и связи в C ++.Вот почему параметр шаблона ссылки не может быть привязан к элементу массива.См. 6.5 Программа и связь [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>;
...