C ++ std :: function operator =

时间:2016-11-18 06:34:39

标签: c++ c++11 stdmap std-function stdbind

我无法在C ++ 11中编译一个简单的程序。 您可以在此处查看http://cpp.sh/9muxf

#include <functional>
#include <iostream>
#include <exception>
#include <tuple>
#include <map>

using namespace std;

typedef int Json;
typedef string String;

class Integer/*: public PluginHelper*/
{
public:
    Json display(const Json& in)
    {
        cout << "bad" << endl;
        return Json();
    }

    map<String, function<Json(Json)>>* getSymbolMap()
    {
        static map<String, function<Json(Json)>> x;
        auto f = bind(&Integer::display, this);
        x["display"] = f;
        return nullptr;
    }
};

问题出现在x["display"] = f;

如果你让我明白这里发生了什么,你会有很大的帮助:)。 std::function可以不被复制吗?

2 个答案:

答案 0 :(得分:2)

Integer::display()需要一个参数。您应该将其指定为占位符,否则从std::bind生成的仿函数的签名将被视为无效,与function<Json(Json)>的签名不匹配。

auto f = bind(&Integer::display, this, std::placeholders::_1);
//                                     ~~~~~~~~~~~~~~~~~~~~~
x["display"] = f;

LIVE

答案 1 :(得分:2)

你的问题在于:

auto f = bind(&Integer::display, this);

Integer::display接受Json const&并且您绑定它没有明确的参数。我的gcc拒绝这样的绑定表达式,但是cpp.sh的编译器和我的clang都允许编译,可能是错误的,因为语言标准声明:

  

*INVOKE* (fd, w1, w2, ..., wN) [func.require]应该是有效的   某些值的表达式 w1,w2,...,wN ,其中   N == sizeof...(bound_args)

您可以通过使绑定的函数对象f正确来解决问题 - 只需添加Json参数的占位符:

auto f = bind(&Integer::display, this, placeholders::_1);

demo