我遇到了麻烦,我在 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;
}
};
地图看起来像
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相同?