Что означает имя U = equal_to & lt; T & gt; в шаблоне имеется ввиду? STL equal_to & lt; T & gt; использование

Я пытался понять этот код

    template <typename T, typename _Prd = equal_to<T> >
struct Vector3
{
protected:
T i,j,k;
_Prd comp;
public:
//default constructor
Vector3(void);

//explicit constructor
Vector3(const T& ijk);

//explicit constructor
Vector3(const T& i,const T& j,const T& k);

//copy constructor
Vector3(const Vector3<T,_Prd>& copy_from);

//getters
T I() const;
T J() const;
T K() const;

//setters
void I(const T& i);
void J(const T& j);
void K(const T& k);

//get magnitude of vector.
T Magnitude() const;

//angle between I,J (clockwise)
T Direction() const;

//angle between K and I,J
T Elevation() const;

//scale vector to 1
Vector3<T,_Prd>& Normalize();

//vector scale up-to value
Vector3<T,_Prd>& Scale(const T& length);

...
};

Я не могу понять первое утверждение

template <typename T, typename _Prd = equal_to<T> > struct Vector3 {};

Речь идет об использовании equal_to<T>Я нашел ссылку из Вот а также Вот. Но все же нет ничего подобного. Спасибо за любую помощь, чтобы заставить меня понять эту часть.

Обновить:

Увидев ответы и прочитав учебник, мой вопрос превращается в 2 аспекта.

1. Шаблонные аргументы по умолчанию

В C ++ 11 мы можем задавать аргументы шаблона по умолчанию для шаблона.
Пример из учебника по С ++ 5-е изд. Стр. 670.

#include <functional>
template <typename T, typename F = less<T> >
int compare (const T &v1, const T &v2, F f = F() )
{
if (f(v1, v2) return -1 ;
if (f(v2, v1) return 1 ;
return 0 ;
}

И тогда мы используем этот шаблон как:

bool i = compare(0,42) ;

Шаблон будет использовать класс по умолчанию без функции-объекта для создания экземпляра.
Тем не менее, когда мы используем наши собственные объекты:

Sales_data item(cin), item2(cin) ;
bool j = compare (item, item2, compareIsbn) ;

Затем F превращается в функцию сравнения объекта Isbn.
Так что то же самое происходит в моем вопросе выше, таким образом, оставим доступ пользователю шаблона, чтобы он мог представить свой собственный объект-функцию, в этом случае он используется в качестве компаратора.

2. Предикаты

Проверьте Что такое предикат в C ++?

0

Решение

std::equal_to шаблон класса, который обеспечивает что-то вроде этого:

bool operator()(T const & lhs, T const & rhs) const { return lhs == rhs; }

Другими словами, это класс объекта-функции, который оборачивает обычный == компаратор. Дело в том, что equal_to может быть специализированным, и, таким образом, обеспечивает ненавязчивый способ добавления настраиваемости.

Кроме того, ваш шаблон Vector3 также обеспечивает назойливый способ настройки компаратора с помощью второго аргумента шаблона.

Обратите внимание, что предикаты обычно объекты, а не только черта классов. Таким образом, ваш контейнер будет фактически содержать подобъект-предикат. Если класс предиката является конструируемым по умолчанию, это не проблема, но если это не так, вы обычно должны предоставить копию предиката в конструкторе контейнера.

В качестве домашнего задания вы можете подумать о том, как избежать расходов на объем памяти на подобъекте предиката.

2

Другие решения

Второму аргументу шаблона _Prd назначается тип по умолчанию, так же как функция может иметь значения по умолчанию для аргументов. STL использует это интенсивно. посмотрите на std :: basic_string в качестве примера

1

По вопросам рекламы [email protected]