Я хотел бы создать конструкцию, аналогичную std :: iterator_traits :: value_type, которая может беспрепятственно работать для всех типов, используя один и тот же синтаксис. Представьте, что у нас есть следующее:
template <typename T>
struct value_type {
typedef T type;
};
#define VALUE_TYPE(T) typename value_type<T >::type
Это будет работать для типов POD. Я могу специализировать его для своего класса:
struct MyClass {
typedef float value_type;
};
template <>
struct value_type<MyClass> {
typedef MyClass::value_type type;
};
хотя я бы предпочел избежать дополнительных экземпляров value_type в идеальном мире.
Проблема с итераторами STL. Мне нужна специализация, которая приводит меня к иерархии итераторов. Это терпит неудачу, потому что компилятор выбирает базовый вариант:
template <>
struct value_type<std::_Iterator_base_aux> { // MSVC implementation
typedef value_type type;
};
Выбор класса выше по иерархии (_Iterator_with_base был бы наиболее естественным, потому что именно там определен value_type) терпит неудачу, потому что требует указания всех черт итератора в качестве аргументов шаблона.
Возможно ли то, что я пытаюсь сделать, даже в C ++?