Я не понимаю, почему работает следующее (хотя я рад, что это работает!):
Я могу определить std::set
объектов с помощью настраиваемого компаратора. Этот настраиваемый компаратор работает путем сравнения некоторых переменных-членов двух сравниваемых объектов. НО тогда я могу использовать функцию set
.find(x)
, где x
относится к типу переменной-члену, а не к самому объекту, и это работает!
Вот чрезвычайно упрощенный пример:
my_class.h
class my_class //just hold an integer
{
public:
int an_int;
my_class(int new_int) : an_int(new_int)
{ }
//compare instances of this class by comparing their integers...
struct compare_instances
{
bool operator() (const my_class &a, const my_class &b) const
{
return a.an_int < b.an_int;
}
};
};
main.cpp:
...
std::set<my_class, my_class::compare_instances> my_class_set;
my_class_set.insert( my_class(18) );
my_class_set.insert( my_class(7) );
my_class_set.insert( my_class(22) );
std::set<my_class, my_class::compare_instances>::const_iterator found_it
= my_class_set.find(18);
std::fprintf(stderr, "found_it->an_int = %d\n", found_it->an_int);
Вывод: "found_it-> an_int = 18" !!!!!!
Я ожидал, что приведенный выше код не будет компилироваться, и компилятор закричит мне, что «18
не относится к типу my_class
». Но это не так ...
Разве аргументы .find
не должны быть того же типа, что и элементы самого set
? Вот что, кажется, говорится в документации ...
my_class(int new_int)
. вы можете создатьmy_class
, начиная сint
. попробуйтеfind("blah")
, и он не скомпилируется :) - person vulkanino   schedule 28.02.2012