使用依赖于 class 的类型和函数在 class 的所有实例中具有相同值的 C++ 变量

C++ Variable with same value across all instances of class using type and functions dependent on class

我有一个函数指针的二维数组,它在 class 的所有实例(数百万!)中具有相同的值。

class Foo{
    public:

    ...

    ...
    static int bar1(const Foo& foo_1, const Foo& foo_2);
    static int bar2(const Foo& foo_1, const Foo& foo_2);
    static int bar3(const Foo& foo_1, const Foo& foo_2);
    static int bar4(const Foo& foo_1, const Foo& foo_2);

    static int bar4(const Foo& foo_1, const Foo& foo_2);

    friend bool foobar_func(const Foo& foo_1, const Foo& foo_2) {
    ...

我的二维数组是这样的:

int (*fcn_pointers[2][2])( const Foo&, const Foo&) = { 
                                                    {&Foo::bar1, &Foo::bar2},
                                                    {&Foo::bar3, &Foo::bar4}
                                                  }

我这辈子都无法让这个二维数组初始化一次,然后在 foobar_func 内部使用。我 运行 遇到问题,因为类型取决于它所属的 class。

这可能吗?性能在这里 非常 重要——我这样做的全部目的是提高性能(如果可行的话,它会的)。所以加一个conditional来检查是否初始化不是我能承受的。

我不熟悉 C++ -- 我对 C++ 的整个体验都是基于一个周末查看此源代码,所以我可能遗漏了一些明显的东西。我对 C++ 的使用不需要比这样的问题更深入,所以学习 C++ 不是优先事项(尽管 link 到一些 'gotchas' 可能会有所帮助_。我是一名博士生,熟悉Java、C 和 Python,所以我理解面向对象编程,只是不知道如何用 C++ 解决这个问题。

我试图做这样的事情,但它说 linker 找不到 Foo::bar1 等等

class Foo{
    public:

    static int bar1(const Foo& foo_1, const Foo& foo_2);
    static int bar2(const Foo& foo_1, const Foo& foo_2);

    friend bool foobar_func(const Foo& foo_1, const Foo& foo_2) {
       return false;
    }

};

int (*fcn_pointers[2][2])( const Foo&, const Foo&) = { 
                             {&Foo::bar1, &Foo::bar2},
                             {&Foo::bar1, &Foo::bar2}
                                              };


admin@test:~/test$ g++ -std=c++11 test.cpp
/tmp/ccN4yJ56.o:(.data+0x0): undefined reference to `Foo::bar1(Foo const&, Foo const&)'
/tmp/ccN4yJ56.o:(.data+0x8): undefined reference to `Foo::bar2(Foo const&, Foo const&)'

这是解决问题的一种方法:

class Foo
{
public:
    static int bar1(const Foo& foo_1, const Foo& foo_2);
    static int bar2(const Foo& foo_1, const Foo& foo_2);
    static int bar3(const Foo& foo_1, const Foo& foo_2);
    static int bar4(const Foo& foo_1, const Foo& foo_2);

    typedef int(*fcn_pointers_type)(const Foo&, const Foo&);

    static const fcn_pointers_type funcs[2][2];
};

// put in a source file
const Foo::fcn_pointers_type funcs[2][2] = { { &Foo::bar1, &Foo::bar2 }, { &Foo::bar3, &Foo::bar4 } };