Каков наилучший способ получить тип, содержащийся в std::необязательно?

#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;
    };