簡體   English   中英

在帶有boost :: bind的std :: map中調用函子

[英]Calling a functor in a std::map with boost::bind

我遇到了麻煩,因此無法找到解決方案。 我花了一段時間才弄清楚,所以我想把它貼出來,以防它對其他人有用

問題:我有一組不同類型的函子,我想將其存儲在std :: map中,然后再調用類似switch語句/工廠的函數。

class Foo {
public:
    void operator() (int x) {
        std::cout << "In foo" << x << std::endl;
    }
};
class Bar {
public:
    void operator() (int x) {
        std::cout << "In Bar" << x << std::endl;
    }
};

地圖看起來像

std::map<int,boost::function<void(int)>> maps;

和插入看起來像

maps.insert(std::make_pair(1,boost::bind(&Foo::operator(),Foo(),_1)));

你可以這樣稱呼它

auto iter = maps.find(1);
iter->second(123);

看着解決方案,這是一個非常簡單的班輪,與試圖弄清楚它的精神體操相比,-好吧:)

我最初試圖做的是存儲boost :: signals2 :: signal對象,以便可以在地圖上鏈接一組工廠,但是我從來沒有弄清楚。 因此,有一個問題,我該如何將其存儲在地圖中?

std::map<std::string,boost::signals2::signal<void(int)>> m_factory;
// Create the object I want to store
boost::signals2::signal<void(int)> sig;
sig.connect(Foo());
// This fails
m_factory.insert(std::make_pair("Blah",sig));

但我明白了

std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert(std::pair<const _Kty,_Ty> &&)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> &&

編輯進一步簡化了示例

編輯2-修正我在引用地圖時聲明地圖的錯誤

除此之外,這似乎還可以

typedef boost::signals2::signal<void(int)> Signal;
m_factory["Blah"] = Signal().connect(Foo());

在邏輯上我認為與make_pair相同?

boost :: signals是不可復制的,這使其不適合與std容器一起使用。 您應該像這樣使用指向信號的指針(可能是智能指針)

typedef boost::signals2::signal<void(int)> sig;
typedef std::shared_ptr<sig> pSig;
typedef std::map<int, pSig> map_sig;

void f(int){}

int main(){
    pSig s(new sig);
    s->connect(f);

    map_sig m;
    m.insert( map_sig::value_type(1, s) );
}

(您可以在此處嘗試代碼)。

暫無
暫無

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

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