Сообщение Re[8]: std::get(std::variant) от 25.10.2025 7:49
Изменено 25.10.2025 8:06 rg45
Re[8]: std::get(std::variant)
Здравствуйте, so5team, Вы писали:
S>Для C++17 у меня получилось что-то вроде: https://godbolt.org/z/YnehMhsT9
S>Но не покидает ощущение, что более продвинутые в современном C++ товарищи смогут сделать проще и компактнее.
Не претендую на звание более продвинутого, но свой вариант предложу, всё-таки:
https://godbolt.org/z/q9j3fbsKn
S>Для C++17 у меня получилось что-то вроде: https://godbolt.org/z/YnehMhsT9
S>Но не покидает ощущение, что более продвинутые в современном C++ товарищи смогут сделать проще и компактнее.
Не претендую на звание более продвинутого, но свой вариант предложу, всё-таки:
https://godbolt.org/z/q9j3fbsKn
void has_name_aux(...);
template<typename T> auto has_name_aux(const T& t) -> decltype(t.name);
template<typename T> constexpr bool has_name_v =
std::is_same_v<std::string, decltype(has_name_aux(std::declval<T>()))>;Re[8]: std::get(std::variant)
Здравствуйте, so5team, Вы писали:
S>Для C++17 у меня получилось что-то вроде: https://godbolt.org/z/YnehMhsT9
S>Но не покидает ощущение, что более продвинутые в современном C++ товарищи смогут сделать проще и компактнее.
Не претендую на звание более продвинутого, но свой вариант предложу, всё-таки:
https://godbolt.org/z/bGeY793rs
S>Для C++17 у меня получилось что-то вроде: https://godbolt.org/z/YnehMhsT9
S>Но не покидает ощущение, что более продвинутые в современном C++ товарищи смогут сделать проще и компактнее.
Не претендую на звание более продвинутого, но свой вариант предложу, всё-таки:
https://godbolt.org/z/bGeY793rs
void has_name_aux(...);
template<typename T> auto has_name_aux(const T& t) -> decltype(t.name);
template<typename T> constexpr bool has_name_v =
std::is_same_v<std::string, decltype(has_name_aux(std::declval<T>()))>;
template <typename...T>
std::string getName(const std::variant<T...>& v)
{
return std::visit(
[]<typename X>(X&& x) -> std::string {
if constexpr(has_name_v<X>)
return x.name;
else
return {};
}
, v);
}