Концепция C++ для соответствия альтернативе std::variant (но она также работает с типами, унаследованными от std::varianC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Концепция C++ для соответствия альтернативе std::variant (но она также работает с типами, унаследованными от std::varian

Сообщение Anonymous »

Я использую много std::variant. У меня есть эта надежная вспомогательная концепция, которая соответствует альтернативам определенного типа варианта:
template
struct alternative_c_impl {
static_assert(false, "can't use is_alternative with a non-variant"); // legal in C++23
};
template
struct alternative_c_impl
: std::disjunction
{};
template
concept alternative_c = alternative_c_impl::value;

auto main() -> int
{
using simple_variant = std::variant;
static_assert(alternative_c);
static_assert(alternative_c == false);
}

Однако в C++23 теперь мы можем использовать типы, производные от std::variant. В таких случаях этот подход ожидаемо терпит неудачу с исходным static_assert. Мои навыки работы с шаблонами немного подзабыли, и у меня возникли проблемы с расширением его для работы с таким типом. Я предполагаю, что это каким-то образом связано с std::derived_from. Говоря языком кода, мне нужна концепция Mystery_c, которая работает аналогично:
struct derived_var : std::variant
{

};

auto main() -> int
{
static_assert(mystery_c);
static_assert(mystery_c == false);
}


Подробнее здесь: https://stackoverflow.com/questions/782 ... works-with
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»