Основные понятия - как ограничить значение интегрального шаблона

Есть такое определение шаблона:

template<size_t N>
void foo( void ) {
  /* ... */
}

Как определить понятие так, чтобы N было ненулевым положительным значением (N> = 1)?

Что-то вроде:

template<size_t N>
concept NonZeroSize = /* to be implemented, N>=1 */

template<NonZeroSize N>
void foo( void ) {
  /* Do whatever only if N >= 1 */
}

Спасибо!


person Martin Kopecký    schedule 04.05.2020    source источник


Ответы (1)


Нравится:

template <size_t N> requires NonZeroSize<N>
void foo();

Или просто:

template <size_t N> requires (N > 0)
void foo();

Краткая форма зарезервирована для понятий типа.


Само определение концепции - это просто произвольное логическое выражение:

template <size_t N>
concept NonZeroSize = (N > 0);

requires-expression - это просто специальное вид выражения, который очень полезен при определении понятий, но не должен использоваться во всех определениях понятий и не должен появляться в определении понятия с самого начала. Эти вещи ортогональны.

person Barry    schedule 04.05.2020
comment
Как определить само понятие NonZeroSize? - person Martin Kopecký; 04.05.2020
comment
@ MartinKopecký Определение понятия просто принимает логическое выражение. - person Barry; 04.05.2020
comment
@ MartinKopecký, проще говоря, template <size_t N> concept NonZeroSize = N != 0;. requires, который вы обычно видите, это просто регулярное логическое выражение. - person chris; 04.05.2020
comment
@chris В этом случае GCC жалуется, что «NonZeroSize» не ограничивает тип ... - person Martin Kopecký; 04.05.2020
comment
@ MartinKopecký У меня работает. У вас есть пример? - person Barry; 04.05.2020
comment
@Barry: Я расширил ваш тестовый код godbolt.org/z/yaEkUh, и он сообщает о той же проблеме там... - person Martin Kopecký; 04.05.2020
comment
@ MartinKopecký Да, ты не можешь этого сделать. Как я уже сказал в ответе, сокращенная форма зарезервирована для концепций типов. Вы должны использовать предложение required. - person Barry; 04.05.2020