Более короткий способ разрешения типа в класс:: typedef
У меня есть несколько классов. Сейчас они разделены одним символом. Немногие из них содержат type (a 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'
Один из способов-использовать basic 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. Идеи, связанные с этим, также являются добро пожаловать.]