Информация об изменениях

Сообщение 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

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

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 — это вариант ты знаешь.