c++ - 需要调用没有对象的非静态方法

标签 c++ templates object static circular-dependency

考虑以下 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;
};

现在,这无法编译,因为在 FooEqualoperator () 中我无法调用非静态 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/

相关文章:

c++ - 不同构造函数中的构造函数调用产生错误数据

java - 如何将两个数组列表的对象在指定索引处相互传递

Objective-C id 和 NSObject

c++ - 如何在 OpenGL 中叠加文本

C++ 多个版本的默认特殊成员函数——MSVC 2015 中的错误

c++ - 在另一个类主体中具有 variadict 模板的类的类型

c++ - 哪个编译器是对的?需要模板化返回类型之前的 'template'?

python - 如何将 `lambda` 对象转换为 `function` 对象以在 Python 中进行酸洗?

c++ - CAutoPtr 类是否实现引用计数?

java - C++ 模板和 Java 中的继承