簡體   English   中英

存儲指向成員函數的指針的容器

[英]Storing a container of pointers to member functions

我試圖弄清楚如何為不同對象(不同類)的不同成員函數編寫指針容器,例如(偽代碼)

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

現在,我可以考慮為所有要存儲成員函數的對象添加基類,但是無論如何如何調用適當的成員函數?

這取決於您希望如何調用這些函數。 如果要使用相同的簽名來調用它們,則解決方案非常簡單:只需保留函數向量即可。

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

如果您需要進一步研究,我建議您閱讀有關類型擦除的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM