【问题标题】:Storing boost::bind functions in a std::map在 std::map 中存储 boost::bind 函数
【发布时间】:2012-03-29 01:13:00
【问题描述】:

我正在创建一堆函数,它们都有效地做同样的事情:

long Foo::check(long retValue, unsigned toCheck, const std::set<unsigned>& s)
{
    auto it = s.find(toCheck);
    return (it == s.end()) ? -retValue : retValue;
}

Foo 是一个类。到目前为止,一切都相当简单。现在,我实际上想在此创建很多变体,但绑定到不同的集合。然后我想将这些存储在 std::map 中。因此,使用 boost::bind 和 boost::function,执行如下操作:

void Foo::addToMap(unsigned option, const std::set<unsigned>& currentSet)
{
    someMap[option] = boost::bind(&Foo::check, this, _1, _2, currentSet);
}

我遇到的问题是试图定义地图的类型。我以为会是:

std::map<unsigned, boost::function<long (long, unsigned)> > someMap;

但是用 MSVC 9.0 编译它会得到:error C2582: 'operator =' function is unavailable in 'boost::function&lt;Signature&gt;'

map 的第二个模板参数究竟应该是什么?

【问题讨论】:

  • 您是否尝试将 set 参数(以绑定)包装在 boost::ref 或其他任何名称中?引用不可分配。
  • @Cheersandhth.-Alf 尝试用 boost::cref(currentSet) 包装它,但这给出了完全相同的错误。如果我通过非常量传递它,则相同,如果我通过非常量值传递它,则相同...
  • 哦,该死。那么请尝试在最小的程序中重现问题,并发布(完整代码)。
  • @Cheersandhth.-Alf 谢谢。你间接帮助我解决了这个问题,因为通过创建一个最小的程序,我意识到我没有包含正确的头文件。

标签: c++ boost map boost-bind boost-function


【解决方案1】:

使用 boost 1.49 和 g++ 4.4.4,我能够做一些非常相似的事情。这是一个代码sn-p。

typedef boost::function< void (SomeType) > CallbackType;

std::pair<std::string, CallbackType> NameCallbackPair;

然后我可以使用以下内容对其进行分配:

NameCallbackPair somePair(someString, boost::bind(&SomeClass::someMethod, this, _1));

也许是 MSVC9 的问题。

【讨论】:

    【解决方案2】:

    啊,我解决了。我包含了错误的头文件;而不是:

    #include &lt;boost/function.hpp&gt;

    我包含了 boost/function 文件夹中的内容,例如:

    #include &lt;boost/function/function_fwd.hpp&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多