Сообщение Re: выделить тип из optional который сам template type от 01.02.2024 21:27
Изменено 01.02.2024 21:55 rg45
Re: выделить тип из optional который сам template type
Здравствуйте, The Passenger, Вы писали:
TP>1. Как определить что тип optional?
Можно даже в более общем виде — определить, является ли некий тип воплощением произвольно заданного шаблона:
http://coliru.stacked-crooked.com/a/6f6551277ce4b161
Если optional интересует больше других типов, на основе этого можно определить более специальный инструмент:
Понятное дело, можно обойтись и без концептов, привычными метафункциями.
TP>2. Как вычленить тип из optional?
TP>Можно решить это в лоб перегрузкой, но хочеться красиво ... хотя может перегрузкой может получиться красивее
Если перегрузка подходит, то, имхо, это самый оптимпавльный вариант. Еще варианты:
1. Использовать концепт, определенный выше (C++20 и выше):
2. Старый добрый SFINAE:
3. if constexpr — это вариант ты знаешь.
TP>1. Как определить что тип optional?
Можно даже в более общем виде — определить, является ли некий тип воплощением произвольно заданного шаблона:
http://coliru.stacked-crooked.com/a/6f6551277ce4b161
template <typename, template <typename...> class> struct is_instance_of : std::false_type {};
template <template <typename...> class T, typename...X> struct is_instance_of<T<X...>, T> : std::true_type {};
template <typename T, template <typename...> class TT> concept instance_of = is_instance_of<T, TT>::value;
static_assert(instance_of<std::optional<int>, std::optional>);
static_assert(instance_of<std::string, std::basic_string>);
static_assert(instance_of<std::map<int, double>, std::map>);
Если optional интересует больше других типов, на основе этого можно определить более специальный инструмент:
template <typename T> concept is_optional = std::instance_of<T, std::optional>;
static_assert(is_optional<std::map<int, double>>);
Понятное дело, можно обойтись и без концептов, привычными метафункциями.
TP>2. Как вычленить тип из optional?
TP>Можно решить это в лоб перегрузкой, но хочеться красиво ... хотя может перегрузкой может получиться красивее
Если перегрузка подходит, то, имхо, это самый оптимпавльный вариант. Еще варианты:
1. Использовать концепт, определенный выше (C++20 и выше):
template <instance_of<std::optional> T>
void foo(T&&) { /* . . .*/ }
2. Старый добрый SFINAE:
template <typename T, std::enable_if<is_instance_of<T, std::optional>::value, int> = 0>
void foo(T&&) { /* . . .*/ }
3. if constexpr — это вариант ты знаешь.
Re: выделить тип из optional который сам template type
Здравствуйте, The Passenger, Вы писали:
TP>1. Как определить что тип optional?
Можно даже в более общем виде — определить, является ли некий тип воплощением произвольно заданного шаблона:
http://coliru.stacked-crooked.com/a/6f6551277ce4b161
Если optional интересует больше других типов, на основе этого можно определить более специальный инструмент:
Понятное дело, можно обойтись и без концептов, привычными метафункциями.
TP>2. Как вычленить тип из optional?
TP>Можно решить это в лоб перегрузкой, но хочеться красиво ... хотя может перегрузкой может получиться красивее
Если перегрузка подходит, то, имхо, это самый оптимпавльный вариант. Еще варианты:
1. Использовать концепт, определенный выше (C++20 и выше):
2. Старый добрый SFINAE:
3. if constexpr — это вариант ты знаешь.
TP>1. Как определить что тип optional?
Можно даже в более общем виде — определить, является ли некий тип воплощением произвольно заданного шаблона:
http://coliru.stacked-crooked.com/a/6f6551277ce4b161
template <typename, template <typename...> class> struct is_instance_of : std::false_type {};
template <template <typename...> class T, typename...X> struct is_instance_of<T<X...>, T> : std::true_type {};
template <typename T, template <typename...> class TT> concept instance_of = is_instance_of<T, TT>::value;
static_assert(instance_of<std::optional<int>, std::optional>);
static_assert(instance_of<std::string, std::basic_string>);
static_assert(instance_of<std::map<int, double>, std::map>);
Если optional интересует больше других типов, на основе этого можно определить более специальный инструмент:
template <typename T> concept is_optional = std::instance_of<T, std::optional>;
static_assert(is_optional<std::optional<int>>);
Понятное дело, можно обойтись и без концептов, привычными метафункциями.
TP>2. Как вычленить тип из optional?
TP>Можно решить это в лоб перегрузкой, но хочеться красиво ... хотя может перегрузкой может получиться красивее
Если перегрузка подходит, то, имхо, это самый оптимпавльный вариант. Еще варианты:
1. Использовать концепт, определенный выше (C++20 и выше):
template <instance_of<std::optional> T>
void foo(T&&) { /* . . .*/ }
2. Старый добрый SFINAE:
template <typename T, std::enable_if<is_instance_of<T, std::optional>::value, int> = 0>
void foo(T&&) { /* . . .*/ }
3. if constexpr — это вариант ты знаешь.