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

Сообщение Re: выделить тип из optional который сам template type от 01.02.2024 21:27

Изменено 01.02.2024 21:41 rg45

Re: выделить тип из optional который сам template type
Здравствуйте, The Passenger, Вы писали:

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>>);


Понятное дело, можно обойтись и без концептов, привычными метафункциями.
Re: выделить тип из optional который сам template type
Здравствуйте, The Passenger, Вы писали:

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>>);


Понятное дело, можно обойтись и без концептов, привычными метафункциями.