考虑以下 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;
};
现在,这无法编译,因为在 FooEqual
的 operator ()
中我无法调用非静态 are_foos_equal
。
我的问题是:fooset
是否有可能以某种方式使用 are_foos_equal
?我知道我可以将 are_foos_equal
设为静态,但我给出的示例代码只是为了说明我的问题,不幸的是,这个问题发生在一个更大的项目中,即使这意味着设计有点不对,如果可能的话,我想通过一些技巧来挽救它。
编辑
我在Bar
中添加了一个非静态成员变量w
来强调are_foos_equal
的“非静态”。
最佳答案
将 are_foos_equal()
移到类之外并使其成为自由函数。它应该是 Bar
的成员是没有意义的。示例:
class Foo {
public:
int a;
};
bool are_foos_equal(Foo* f1, Foo* f2)
{return f1->a == f2->a;}
class Bar {
public:
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;
};
关于c++ - 需要调用没有对象的非静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31941594/