使用std :: bind和std :: function

gar*_*ese 2 c++ stdbind c++11 std-function

编辑3:如果我删除第二个createTriangle函数,它的工作原理.那么如何绑定重载函数呢?

我有一个函数,它接受一个带有一个参数的函数对象,如下所示:

int createObject(std::function<void(int)>);
Run Code Online (Sandbox Code Playgroud)

如何用std :: bind调用这个函数?我试过这样的:

createObject(std::bind(&ClassA::createTriangle, std::placeholders::_1, a, b, c, color));
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误:

候选模板被忽略:无法推断模板参数

ClassA :: createTriangle是一个静态函数.


附加信息:

void ClassA::createTriangle(int id, const glm::vec3 & a, const glm::vec3 & b, const glm::vec3 & c, const glm::vec3 & col) {
    /* ... */
}

int ClassB::createTriangle(const glm::vec3 & a, const glm::vec3 & b, const glm::vec3 & c, const glm::vec3 & color) {
    return classCInstance.createObject(std::bind(&classA::createTriangle, std::placeholders::_1, a, b, c, color));
}

int ClassC::createObject(std::function<void(int)> f) {
    f(++id);
    return id;
}
Run Code Online (Sandbox Code Playgroud)

ClassA中还有另一个静态createTriangle函数,它具有不同的last参数.那可能是个问题吗?绑定不知道选择哪个createTriangle?它看起来像这样:

void ClassA::createTriangle(int id, const glm::vec3 & a, const glm::vec3 & b, const glm::vec3 & c, const std::initializer_list<glm::vec3> & colors) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

Jul*_*ano 7

ClassA::createTriangle是一个重载函数,如果不指定要使用的重载,则不能使用它.std::bind必须返回一个通用的包装器,它不能自己解决它,你必须指定.

这应该工作:

void (*mySpecificCreateTriangle)(int, const const glm::vec3 &, const const glm::vec3 &, const const glm::vec3 &, const const glm::vec3 &) = &createTriangle;
createObject(std::bind(mySpecificCreateTriangle, std::placeholders::_1, a, b, c, color));
Run Code Online (Sandbox Code Playgroud)

由于您使用的是C++ 11,因此您会对lambda感到满意:

createObject([=](int id){ return createTriangle(id, a, b, c, color); });
Run Code Online (Sandbox Code Playgroud)