Я использую много 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++ для соответствия альтернативе std::variant (но она также работает с типами, унаследованными от std::varian ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение