Использование auto в параметрах шаблона: некоторые примеры использования и & hellip; как заставить работать с массивами постоянного размера C?

Ok. После нескольких часов поиска я взял тормоз для кофе и сразу нашел ответ:)

Правила безопасности базы данных Firebase поставляются с объектом "auth" , который содержит почти все, что вы (номер телефона, адрес электронной почты, имя и т. д.). Вся информация, которую я искал, помещается в «auth.token ».

Новые правила выглядят следующим образом:

{
  "rules": {
    ".read": "auth != null",
    ".write": "root.child('Users').child(auth.token.phone_number).exists()"      
  }
}

0
задан max66 18 January 2019 в 23:53
поделиться

1 ответ

Насколько я знаю, вы не можете так просто.

Как вы можете прочитать на этой странице

Массив и типы функций могут быть записаны в объявлении шаблона, но они автоматически заменяются указателем на объект и указателем на функцию при необходимости.

Таким образом, вы можете написать

template <auto a, typename TVal>
inline void fill_all(const TVal &v)
 { }

// ...

static int a[4] {};

fill_all<a>(2);

, но fill_all() увидеть тип a как int *, а не как int[4].

Таким образом, вы можете использовать его как указатель, но вы потеряли информацию об измерении.

Лучшее, что я могу себе представить, это вызвать функцию constexpr, которая возвращает размер массива и помещает это значение в качестве параметра шаблона (или аргумента функции)

template <typename T, std::size_t N>
constexpr std::size_t getDim (T const (&)[N])
 { return N; }

template <auto a, std::size_t N, typename TVal>
inline void fill_all (TVal const & v)
 { std::fill(a, a + N, v); }

// ...

static int a[4] {};

fill_all<a, getDim(a)>(2);

, но, к сожалению, я не Не вижу способа избежать явного вызова getDim() в явном списке аргументов шаблона.

0
ответ дан max66 18 January 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: