Подтвердить что ты не робот

Является ли хорошей практикой всегда определять `value_type`, когда мы определяем шаблон

template<typename T>
class Point
{
public:
    typedef T value_type;
    ...
};

Я видел приведенный выше код в книге "C++ в двух словах" Рэй Лишнер, pp176.

Вопросы:

  1. Является ли хорошей практикой всегда добавлять определение для value_type?
  2. Где будет использоваться этот определенный value_type?

Например: Point<int>::value_type?

4b9b3361

Ответ 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).