Концепция 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

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