gpt4 book ai didi

c++ - 使用 boost::bind 在 std::map 中调用仿函数

转载 作者:行者123 更新时间:2023-11-28 07:30:26 26 4
gpt4 key购买 nike

我在这方面遇到了麻烦,我找不到关于 SO 的解决方案。我花了一段时间才弄明白,所以我想我会发布它,以防它对其他人有用

问题:我有一组不同类型的仿函数,我想将它们存储在 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;
}
};

map 看起来像

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 对象,这样我就可以在 map 中链接一组工厂,但我从来没有弄清楚。所以对于一个问题,我将如何将它们存储在 map 中?

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 - 修复我使用引用声明 map 的错误

此外,这似乎工作正常

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

(您可以尝试使用代码 here )。

关于c++ - 使用 boost::bind 在 std::map 中调用仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17855403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com