#c
#c
Вопрос:
Я нашел этот код здесь . Как компилятор узнает, что нужно использовать функцию, определенную в classcomp?
структура / функция
struct classcomp
{
bool operator() (const charamp; lhs, const charamp; rhs) const
{
return lhs<rhs;
}
};
Построение карты
map<char,int,classcomp> fourthm;
Прототипы конструкторов по ссылке выше:
explicit map ( const Compareamp; comp = Compare(),const Allocatoramp; = Allocator() );
template <class InputIterator> map ( InputIterator first, InputIterator last,const Compareamp; comp = Compare(), const Allocatoramp; = Allocator() );
map ( const map<Key,T,Compare,Allocator>amp; x );
Комментарии:
1. en.wikipedia.org/wiki/Function_object#In_C_and_C.2B.2B
2. таким образом, оператор вызова функции перегружен
3. В вашем приведенном примере используется classcomp() … в то время как приведенный выше пример дает classcomp … какой из них правильный
4. @Chris: Они оба есть, в разных контекстах. В его примере создается экземпляр типа для его использования, в вашем примере просто указывается тип в качестве аргумента шаблона (и вызов
map
конструктора неявно создает его экземпляр).
Ответ №1:
Он использует конструктор по умолчанию для класса classcomp, поэтому вы получаете объект, который имеет определенный operator() и действует как функция.
Комментарии:
1. таким образом, оператор вызова функции перегружен
2. Все, к чему вы можете применить оператор вызова функции, является функтором. Функция является функтором, объект типа класса with
operator()
является функтором, объект, который имеет преобразование в указатель на функцию, является функтором.3. Почему в приведенном мной примере нет функции ()? В примере, который предоставил Дейв
4. @Chris : Есть — это в аргументах
map
конструктора,const Compareamp; comp = Compare()
.