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

标签 c++ templates

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

std::vector<std::function<??> > vec;

template<class objectType, class parameter1> // This is just for 1-param funcs
void add_to_vector(objectType& obj, void(objectType::*ptrToFunc)(parameter1)) {
   std::function<void(parameter1)> fun = std::bind(ptrToFunc, obj, std::tr1::placeholders::_1);
   vec.push_back(fun);
}

现在我可以考虑向所有想要存储成员函数的对象添加一个基类,但是如何调用适当的成员函数呢?

最佳答案

这取决于您希望如何调用这些函数。如果要使用相同的签名调用它们,解决方案非常简单:只需保留一个函数 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;
}

如果想法是保留具有任意数量(和类型)参数的函数 vector ,则可以使用 std::vector<boost::any>> .

#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;
}

如果您需要更深入地了解,我建议您阅读更多有关 type erasure 的内容。 .

关于c++ - 存储指向成员函数的指针的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22026687/

相关文章:

c++ - g++ std::is_function 实现:_ArgTypes 后跟 6 个句点是什么意思?

c++ - 使用模板化类型名的函数模板特化

c++ - 我从哪里获得适用于 VS21015 的正确 gdi+ c++ 包装器?

c++ - 静态链接 C++,找不到库

c# - .exe 窗口中的鼠标模拟

c++ - 为什么这些条件不适用于模板类型?

c++ - 检查整个数组是否为空

c++ - 可能发生包扩展的上下文

c++ - 为什么我们不能重复使用具有不同模板参数的别名模板标识符?

templates - 将变量传递给 Ember.js 中的 Handlebars 部分