0

我做了很多搜索,但是 * () 和类范围的组合极大地阻碍了我对语法的理解,每次编辑都会抛出一个新错误,有帮助吗?

我正在尝试做的事情:

声明指向 MyClass.h 中的成员函数的指针的 std::vector

将实际的成员函数分配给 MyClass.cpp 的构造函数中的 std::vector

成员函数不是静态的

谢谢!

4

2 回答 2

2

您可以像这样使用成员函数指针(C++11 与该部分无关):

struct S {
   int foo(){std::cout<<"foo"; return 0;}
   int bar(){std::cout<<"bar"; return 0;}
};

int main() {
   std::vector<int(S::*)()> funcs{&S::foo, &S::bar};

   S s;
   for (auto func : funcs) {
      (s.*func)();
   }
}

但是,如果你使用 C++11,std::function可以让它更干净一点:

std::vector<std::function<int(S &)>> funcs{&S::foo, &S::bar};

S s;
for (auto func : funcs) {
   func(s);
}

如果你使用 C++03,Boost 有boost::function,这也是类似的。

于 2013-04-07T21:19:46.043 回答
2

我很好奇你打算从哪里使用它们。您会看到,为了调用 C++ 类成员函数,您需要一个实例指针来调用它(每个成员函数都需要一个 this 才能访问类状态)。所以通常你会用 std::bind 将成员函数指针与实例指针一起包装,然后可能将结果存储在 std::function 中。要将它们放入向量中,它们都需要相同的签名。

这是你要找的东西吗:

class P
{
    typedef std::function<void (void)> func_t;
    std::vector<func_t> functions;
public:
    P()
    {
        functions.push_back(std::bind(&P::foo1, this));
        functions.push_back(std::bind(&P::foo2, this));
        functions.push_back(std::bind(&P::foo3, this));
    }
    void foo1(void)
    {
        std::cout << "foo1\n";
    }
    void foo2(void)
    {
        std::cout << "foo2\n";
    }
    void foo3(void)
    {
        std::cout << "foo3\n";
    }
    void call()
    {
        for(auto it = functions.begin(); it != functions.end(); ++it)
        {
            (*it)();
        }
    }
};

int main()
{
    P p;
    p.call();
}

在OP进一步澄清后,我将提出以下建议:

class P
{
    typedef std::function<void (void)> func_t;
    std::map<const char*, func_t> functions;
public:
    P()
    {
        functions["foo1"] = std::bind(&P::foo1, this);
        functions["foo2"] = std::bind(&P::foo2, this);
        functions["foo3"] = std::bind(&P::foo3, this);
    }
    void foo1(void)
    {
        std::cout << "foo1\n";
    }
    void foo2(void)
    {
        std::cout << "foo2\n";
    }
    void foo3(void)
    {
        std::cout << "foo3\n";
    }
    void call_by_name(const char* func_name)
    {
        functions[func_name]();
    }
};

int main()
{
    P p;
    p.call_by_name("foo1");
    p.call_by_name("foo2");
    p.call_by_name("foo3");
}
于 2013-04-07T21:28:43.547 回答