【问题标题】:Calling a functor in a std::map with boost::bind使用 boost::bind 在 std::map 中调用函子
【发布时间】:2013-07-25 10:25:52
【问题描述】:

我遇到了这个问题,我在 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> &&

编辑进一步简化了示例

Edit 2 - 修复了我用引用声明地图的错误

除此之外,这似乎工作正常

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

我认为在逻辑上与 make_pair 相同?

【问题讨论】:

  • 您知道您可以发布问题并自己回答,对吧?这可能是第一部分的最佳方法。至于您的信号问题,您为什么将地图值声明为参考?
  • 修正错字。我不知道如何回答您自己的问题 - 谢谢。

标签: c++ boost bind functor


【解决方案1】:

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)。

【讨论】:

  • 这行得通,但如果我将其改回 operator() 并添加返回类型,则行不通。然后它再次失败。仍然会为第一部分投票
  • coliru.stacked-crooked.com/… 我可能误解了你的评论。感谢您的支持。如果您在链接中找到的不是您的意思,请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多