#c #templates
Вопрос:
Мне интересно, каков самый простой способ получить тип, содержащийся в std::необязательно. Решение, о котором я подумал, это:
#include <type_traits>
template <typename Optional_T>
struct GetOptionalContainedType
{
using type = std::remove_reference<decltype(Optional_T::value())>::type;
};
Для этого требуется включить заголовок <type_traits> (мне нужен std::remove_reference) для этого метода, потому что ::value() возвращает ссылку на тип, верно?
Комментарии:
1. Согласно cppreference , у него есть
value_type
typedef, поэтомуtypename Optional_T::value_type;
он должен работать2. @NathanPierson Вау, если это попытка, то это очень полезно
3. Ваш подход тоже потребует
std::declval
. Еще одним было бы соответствие шаблону с частичной специализацией, но в данном случае это, очевидно, не обязательно.4. @Zebrafish Все стандартные контейнеры определяют
value_type
участника.5. @NathanPierson Вы должны написать ответ с точным текстом вашего комментария.
Ответ №1:
Никаких дополнительных заголовков не требуется, просто <optional>
, которые вы уже должны включить.
#include <optional>
template <typename Optional_T> struct GetOptionalContainedType;
template<typename T>
struct GetOptionalContainedType<std::optional<T>>
{
using type = T;
};