Классы всех признаков, такие как std::iterator_traits
, полезны, отделяя свойства типа от его определения, так что, например, свойства могут быть доступны до завершения определения.Унаследованные (или членские) черты idiom
Определяющие черты в дополнение к каждому классу клиента неудобны, потому что черты обычно также имеют место в качестве членов. Вот почему общая реализация std::iterator_traits
определена в терминах ее членов шаблона аргумента.
template< typename it >
struct iterator_traits {
typedef typename it::category category;
typedef typename it::value_type value_type;
// etc
};
Разве не проще и меньше работать для компилятора, вместо этого использовать наследование?
Это не позволяет документировать интерфейс в основном шаблоне, но в любом случае есть другие возможности.
Кажется бессмысленным писать много повторяющегося кода для определения класса метаконтейнеров в идиоме, которая даже не гарантирует предотвращения такого злоупотребления, как создание во время выполнения.
Возможно, это полностью назад. В дополнение к std::iterator_traits
у нас также есть std::iterator
, псевдо-абстрактный базовый класс, в основном с теми же членами. Такая избыточность - это запах кода. Не лучше ли, чтобы пользовательские итераторы выглядели так?
template<>
struct iterator_traits< struct my_iterator > {
typedef random_access_iterator_tag category;
typedef foo value_type;
...
};
struct my_iterator : iterator_traits< struct my_iterator > {
...
};
(Ради аргумента, давайте игнорировать тот факт, что фактическая std::iterator_traits
специализация должна быть объявлена в namespace std
. Я пытаюсь сделать привычную иллюстрацией чего-то, что может произойти в пользовательском коде.)
Это чище в том, что идиома не должна нарушаться, чтобы справляться с каким-либо исключительным случаем, в первую очередь требовала причудливых ног. Вместо шаблона первичных признаков, создающего внутреннюю ошибку, которую недостающий клиентский класс не подходит для чего-то, шаблона первичных признаков вообще не должно быть.
Концептуально лучше отделить качества класса от реализации его услуг независимо от того, необходимо ли это разделение. НО, этот стиль требует разбиения каждого клиентского класса на две части, включая явную специализацию, которая является своего рода уродливой.
Кто-нибудь знаком с этим дизайнерским пространством? Я склоняюсь к второму идиому, хотя на практике это выглядит необычно. Но есть, вероятно, и те, и другие, известные тем, кто раньше здесь жил.