C++ 存储指向成员函数的指针容器

C++ 存储指向成员函数的指针容器,c++,templates,C++,Templates,我试图找出如何为不同对象(不同类)编写指向不同成员函数的指针容器,比如(伪代码) std::vector这取决于您希望如何调用这些函数。如果要使用相同的签名调用它们,那么解决方案非常简单:只需保留一个函数向量 #include <iostream> #include <vector> #include <functional> using namespace std; using namespace placeholders; struct Foo {

我试图找出如何为不同对象(不同类)编写指向不同成员函数的指针容器,比如(伪代码)


std::vector这取决于您希望如何调用这些函数。如果要使用相同的签名调用它们,那么解决方案非常简单:只需保留一个函数向量

#include <iostream>
#include <vector>
#include <functional>

using namespace std;
using namespace placeholders;

struct Foo {
    void value(int x) { cout << x << endl; }
};

struct Bar {
    void sum(int y, int z) { cout << (y + z) << endl; }
};

int main() {

    Foo foo;
    Bar bar;

    vector<function<void(int)>> vec;
    vec.push_back(std::bind(&Foo::value, &foo, _1));
    vec.push_back(std::bind(&Bar::sum, &bar, _1, 1));

    for (auto f : vec) f(1);

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
使用名称空间占位符;
结构Foo{

void value(int x){所以真正的问题不是关于成员函数指针-而是如何存储std::函数的向量,其中每个函数都应该接受不同类型(或数量?)的参数?您需要另一层类型擦除(std::函数已经提供了1层)备份并描述您的真实问题。上面我们看到了一个零碎的描述,说明了您不了解如何着手解决您遇到的真实问题的一个解决方案。描述真实问题将使上述内容更容易理解,并可能指出一个完全不同的解决方法。
#include <iostream>
#include <vector>
#include <functional>

using namespace std;
using namespace placeholders;

struct Foo {
    void value(int x) { cout << x << endl; }
};

struct Bar {
    void sum(int y, int z) { cout << (y + z) << endl; }
};

int main() {

    Foo foo;
    Bar bar;

    vector<function<void(int)>> vec;
    vec.push_back(std::bind(&Foo::value, &foo, _1));
    vec.push_back(std::bind(&Bar::sum, &bar, _1, 1));

    for (auto f : vec) f(1);

    return 0;
}
#include <boost/any.hpp>

int main() {

    Foo foo;
    Bar bar;

    typedef function<void(int)> F1;
    typedef function<void(int,int)> F2;

    vector<boost::any> vec;
    vec.push_back(F1(bind(&Foo::value, &foo, _1)));
    vec.push_back(F2(bind(&Bar::sum, &bar, _1, _2)));

    for (boost::any& any : vec) {
        if (F1* f1 = boost::any_cast<F1>(&any)) (*f1)(1);
        else if (F2* f2 = boost::any_cast<F2>(&any)) (*f2)(1, 1);
    }

    return 0;
}