Проверка концепции на соответствие типу

#c #c -concepts #c 20

#c #c -концепции #c 20

Вопрос:

Как получить константное выражение типа bool из концепции и типа?

 template<class T>
concept Valid = requires(T t) {
    { t.x };
};

struct ValidExample   { int x; };
struct InValidExample {};

static_assert(?); // ValidExample is Valid
static_assert(?); // InValidExample is not Valid
  

Я начинаю играть с концепциями, и я хотел бы проверить тип на соответствие концепции (если быть более точным: определить признак из концепции). Как это сделать?

Ответ №1:

Вы могли бы использовать:

 static_assert(Valid<ValidExample>); // ValidExample is Valid
static_assert(!Valid<InValidExample>); // InValidExample is not Valid
  

в качестве переменных шаблона (типа bool ).

Комментарии:

1. <вставить facepalm>

2. @YSC — Кто бы мог подумать, что шумный bool concept синтаксис может иметь реальную ценность 🙂

3. @bartop: В этом нет ничего странного. Концепция — это просто шаблон переменной . Вы получаете к ней доступ, как к любому другому шаблону переменных.

4. @StoryTeller Какое значение?

5. @Barry — Намекает на использование в качестве логической константы. Это должно было быть ироничным, tbh.