Более короткий способ определения типа в классе::typedef
У меня есть несколько классов. Пока они разделены одним символом. Мало из них содержит type
(а typedef
) и немногие из них не имеют его.
struct A { ... public: typedef someclass type; }
struct B { ... };
Я хочу реализовать класс SFINAE таким образом, чтобы
Resolve<A>::type o1; // should resolve to 'A::type'
Resolve<B>::type o2; // should resolve to 'B'
Одним из способов является использование основного SFINAE, как показано в предыдущей ссылке, которая проверяет, T
содержит type
а затем использовать bool
шашка. Например,
template <typename T>
struct has_type {
typedef char yes[3];
template <typename C> static yes& test(typename C::type*);
template <typename> static char& test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
template<typename TYPE, bool = has_type<TYPE>::value>
struct Contains { typedef typename TYPE::type type; };
template<typename TYPE>
struct Contains<TYPE, false> { typedef TYPE type; };
template<class TYPE>
struct Resolve {
typedef typename Contains<TYPE>::type type;
};
Вопрос: У меня есть много таких примеров в коде, и я чувствую, что этот метод может значительно увеличить время компиляции. Потому что нужно пройти две итерации: 1-й для поиска type
и 2-е решение bool
флаг.
Есть ли более быстрый способ сократить время компиляции?
[Примечание: в этом случае я поставил type
в качестве разделителя между A
а также B
, Тем не менее, я могу положить что-нибудь внутрь A
который отделит его от B
, Мы также приветствуем идеи, связанные с этим.]
1 ответ
template<typename>
struct void_ {
typedef void type;
};
template<typename T, typename = void>
struct Resolve {
typedef T type;
};
template<typename T>
struct Resolve <T, typename void_<typename T::type>::type> {
typedef typename T::type type;
};