Рассмотрим следующий фрагмент кода C++:нужно вызвать нестатический метод без объекта
class Foo {
public:
int a;
};
class Bar {
public:
int w = 1;
bool are_foos_equal(Foo* f1, Foo* f2) { return f1->a * w == f2->a * w; }
struct FooHash { size_t operator() (Foo* f) const { return f->a; } };
struct FooEqual {
bool operator() (Foo* f1, Foo* f2) const {
return are_foos_equal(f1, f2);
}
};
std::unordered_set<Foo*, FooHash, FooEqual> fooset;
};
Теперь это не компилируется, потому что в operator()
из FooEqual
я не могу ссылаться на нестатическая are_foos_equal
.
Мой вопрос: возможно ли fooset
использовать are_foos_equal
как-то? Я знаю, что я мог бы просто ставить are_foos_equal
, но код кода, который я дал, просто так, что я мог бы указать свою проблему, которая, к сожалению, произошла в гораздо более крупном проекте, и даже если это означает, что дизайн несколько неправильный, я бы как бы спасти его некоторыми хаками, если это возможно.
EDIT
Я добавил нестатический переменную-член w
в Bar
подчеркнуть "не-статичность" из are_foos_equal
.
Если вы открыты для ** очень ** плохие идеи, если не-статический метод Безразлично действительно ли доступ к любому нестационарному члену, вы можете называть его «nullptr» и молиться. Но почему это не статично в первую очередь? – Quentin
Вы также можете создать временный объект Bar и называть 'are_foos_equal' на нем, это разрешено здесь. – ForEveR
Что здесь делать? Вопрос четко сформулирован, включает соответствующий код и т. Д. – Angew