Я пытался понять этот код
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 ++?
std::equal_to
шаблон класса, который обеспечивает что-то вроде этого:
bool operator()(T const & lhs, T const & rhs) const { return lhs == rhs; }
Другими словами, это класс объекта-функции, который оборачивает обычный ==
компаратор. Дело в том, что equal_to
может быть специализированным, и, таким образом, обеспечивает ненавязчивый способ добавления настраиваемости.
Кроме того, ваш шаблон Vector3
также обеспечивает назойливый способ настройки компаратора с помощью второго аргумента шаблона.
Обратите внимание, что предикаты обычно объекты, а не только черта классов. Таким образом, ваш контейнер будет фактически содержать подобъект-предикат. Если класс предиката является конструируемым по умолчанию, это не проблема, но если это не так, вы обычно должны предоставить копию предиката в конструкторе контейнера.
В качестве домашнего задания вы можете подумать о том, как избежать расходов на объем памяти на подобъекте предиката.
Второму аргументу шаблона _Prd назначается тип по умолчанию, так же как функция может иметь значения по умолчанию для аргументов. STL использует это интенсивно. посмотрите на std :: basic_string в качестве примера