Сообщение Re: выделить тип из optional который сам template type от 01.02.2024 21:27
Изменено 01.02.2024 22:06 rg45
Re: выделить тип из optional который сам template type
Здравствуйте, The Passenger, Вы писали:
TP>1. Как определить что тип optional?
Можно даже в более общем виде — определить, является ли некий тип воплощением произвольно заданного шаблона:
http://coliru.stacked-crooked.com/a/9c144654296f4337
Если optional интересует больше других типов, на основе этого можно определить более специальный инструмент:
Понятное дело, можно обойтись и без концептов, привычными метафункциями.
TP>2. Как вычленить тип из optional?
TP>Можно решить это в лоб перегрузкой, но хочеться красиво ... хотя может перегрузкой может получиться красивее
Если перегрузка подходит, то, имхо, это самый оптимпавльный вариант. Еще варианты:
1. Использовать концепт, определенный выше (C++20 и выше):
2. Старый добрый SFINAE:
3. if constexpr — это вариант ты знаешь.
TP>1. Как определить что тип optional?
Можно даже в более общем виде — определить, является ли некий тип воплощением произвольно заданного шаблона:
http://coliru.stacked-crooked.com/a/9c144654296f4337
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<std::decay_t<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?
template <typename> struct optional_underlying;
template <typename T> struct optional_underlying<std::optional<T>> { typename type = T; };
template <std::instance_of<std::optional> T>
using optional_underlying_t = typename optional_underlying<T>::type;
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/9c144654296f4337
Если optional интересует больше других типов, на основе этого можно определить более специальный инструмент:
Понятное дело, можно обойтись и без концептов, привычными метафункциями.
TP>2. Как вычленить тип из optional?
TP>Можно решить это в лоб перегрузкой, но хочеться красиво ... хотя может перегрузкой может получиться красивее
Если перегрузка подходит, то, имхо, это самый оптимальный вариант. Еще варианты:
1. Использовать концепт, определенный выше (C++20 и выше):
2. Старый добрый SFINAE:
3. if constexpr — это вариант ты знаешь.
TP>1. Как определить что тип optional?
Можно даже в более общем виде — определить, является ли некий тип воплощением произвольно заданного шаблона:
http://coliru.stacked-crooked.com/a/9c144654296f4337
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<std::decay_t<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?
template <typename> struct optional_underlying;
template <typename T> struct optional_underlying<std::optional<T>> { typename type = T; };
template <std::instance_of<std::optional> T>
using optional_underlying_t = typename optional_underlying<T>::type;
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 — это вариант ты знаешь.