Использование auto в параметрах шаблона: некоторые примеры использования и ... как заставить работать с массивами C постоянного размера? - PullRequest
0 голосов
/ 19 января 2019

У меня есть следующее примерное использование auto в параметрах шаблона (которое мне нравится независимо от их здравомыслия или наличия лучших альтернатив, я просто пытаюсь внедрить функцию 'auto in template params'):

//1-Check if input is within open interval (l, h) where l & h are function parameters
//Example: int x = 5, y = fnc_y(), z = fnc_z(); auto fOk = gt_lt(z, x, y);
template<typename L, typename H, typename V> inline bool 
gt_lt(const V &v, const L& l, const H& h) { return (v > l) && (v < h); }

//2-Check if input is within open interval (l, h) where l & h are auto template parameters
//Example: int z = fnc_z(); auto fOk = gt_lt<5, 45>(z);
template<auto l, auto h, typename V>
inline bool gt_lt(const V &v) { return (v > l) && (v < h); }

//3-Fill a C array (a) of known size with a value where a is a function parameter: 
// char a[4]; fill_all(a, 'a');
template<typename TArrayValType, size_t N, typename TVal>
inline void fill_all(TArrayValType(&a)[N], const TVal &v) { std::fill(a, a + N, v); }

//4-Fill a C array (a) of known size with a value where a is an auto template parameter
//Can't figure out it!!! Goal: char a[4]; fill_all<a>('a');
template<auto a, **....what else to put it here?**, typename TVal>
inline void fill_all(const TVal &v) { std::fill(a, a + N, v); }

Использование № 4 не работает.Как заставить это работать?Я подозреваю, что что-то вроде Извлечение значения SIZE без знания его типа будет работать, но все равно не сможет заставить его работать ...

Одной из причин такого использования было бы избежатьПередача некоторых значений (когда они известны во время компиляции) в качестве параметров функции даже в режиме отладки для лучшей производительности отладки, или, надеюсь, иногда это полезно в полностью оптимизированных сборках в случаях, когда компиляция генерирует еще более эффективный код, если избежать передачи параметров, благодаряАвто для нетиповых параметров.Но, тем не менее, я все еще не уверен, имеет ли это смысл ...

1 Ответ

0 голосов
/ 19 января 2019

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

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

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

Так что вы можете написать

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() в списке явных аргументов шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...