Является ли хорошей практикой всегда определять `value_type`, когда мы определяем шаблон
template<typename T>
class Point
{
public:
typedef T value_type;
...
};
Я видел приведенный выше код в книге "C++ в двух словах" Рэй Лишнер, pp176.
Вопросы:
- Является ли хорошей практикой всегда добавлять определение для
value_type
? - Где будет использоваться этот определенный
value_type
?
Например: Point<int>::value_type
?
Ответы
Ответ 1
Это не больно иметь один, но в основном это имеет смысл только для контейнеров (например, std::vector
), так как все контейнеры предоставляют этот typedef
и единый интерфейс для доступа к содержащимся значениям (begin
/end
, front
/back
), хотя это в большинстве случаев устарело в С++ 11 с auto
и decltype
. Тем не менее, еще чище сказать some_template<typename container::value_type> ...
.
Это, в свою очередь, означает, что они могут быть взаимозаменяемы в общем коде (основная причина, по которой все было сделано именно так). Если для вашего класса Point
имеет смысл знать, какие типы являются содержащимися значениями, хорошо, это typedef
. Как я уже сказал, это не больно. Тем не менее, я чувствую, что это не имеет особого смысла для конкретного примера.
Ответ 2
Хорошая практика для написания функций, выполняемых на контейнерах. Например, если я написал функцию swap
, которая принимает контейнер (templated) и два индекса для обмена, тогда я мог бы использовать определение value_type
для определения временной переменной.
template<typename T>
void swap(T &container, int i, int j) {
typename T::value_type temp = container[i];
container[i] = container[j];
container[i] = temp;
}
Ответ 3
Я бы сказал, только если это имеет смысл для типа. Я столкнулся с трудностями, когда value_type встает на пути, потому что какой-то общий алгоритм ошибочно принимает на себя какой-то контейнер (в моем случае я, похоже, помню, что это был некоторый алгоритм в boost, который предположил, что shared_ptr был контейнером контейнера с несколькими элементами из-за value_type).