Как получить внутренний тип шаблона типа? - PullRequest
1 голос
/ 27 января 2020

У меня следующая ситуация:

Это тип оболочки

template <typename wrapperInnerType>
struct wrapperT{ ... };
using wrapper = wrapperT<float>;

И он используется в этом классе

template <typename wrapperType>
class InData{
    wrapperInnerType var;   //<-- How to get inner type?
};

У меня вопрос, что самый простой способ получить wrapperInnerType из wrapperType?

В идеале мне бы хотелось, чтобы по-прежнему можно было использовать InData<wrapper> myData; при использовании этого класса (вместо нескольких типов в объявлении, как в InData<wrapper, float> myData; в качестве примера). ).

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Самый простой способ - определить псевдоним типа в wrapperT.

template <typename wrapperInnerType>
struct wrapperT {
    using innerType = T;
    // ...
};
using wrapper = wrapperT<float>;

template <typename wrapperType>
class InData{
    typename wrapperType::innerType var;
};

Другой подход может заключаться в создании вспомогательной структуры, извлекающей ее с использованием параметра шаблона шаблона и частичной специализации. Это позволит избежать необходимости изменять wrapperT и потенциально может дать некоторое повторное использование. Однако для этой работы должна быть известна шаблонная подпись wrap.

template <typename T>
struct getInnerType;

template <template <typename> typename wrap, typename Inner>
struct getInnerType<wrap<Inner>> {
    using type = Inner;
}

template <typename T> // For more convenient use as pointed out in comments
using getInnerType_t = typename getInnerType<T>::type

template <typename wrapperType>
class InData{
    getInnerType_t<wrapperType> var;   //<-- How to get inner type?
};
3 голосов
/ 27 января 2020

Вы можете объявить следующий шаблон класса, wrapper_inner_type:

template<typename>
struct wrapper_inner_type;

Затем, специализируйте его для оболочки, wrapperT<InnerType>, где InnerType - это тип, который вы хотите узнать:

template<typename InnerType>
struct wrapper_inner_type<wrapperT<InnerType>> {
   using type = InnerType;
};

Вы также можете определить этот шаблон псевдонима для удобства:

template<typename T>
using wrapper_inner_type_t = typename wrapper_inner_type<T>::type;

Наконец, чтобы получить внутренний тип внутри InData:

template <typename wrapperType>
class InData{
    wrapper_inner_type_t<wrapperType> var;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...