C++ std::bind和std::function的使用

C++ std::bind和std::function的使用,c++,c++11,std-function,stdbind,C++,C++11,Std Function,Stdbind,EDIT3:如果删除第二个createTriangle函数,它会工作。那么如何绑定重载函数呢? 我有一个函数,它接受一个带有一个参数的函数对象,如下所示: int createObject(std::function<void(int)>); createObject(std::bind(&ClassA::createTriangle, std::placeholders::_1, a, b, c, color)); void ClassA::createTriangle

EDIT3:如果删除第二个createTriangle函数,它会工作。那么如何绑定重载函数呢?

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

int createObject(std::function<void(int)>);
createObject(std::bind(&ClassA::createTriangle, std::placeholders::_1, a, b, c, color));
void ClassA::createTriangle(int id, const glm::vec3 & a, const glm::vec3 & b, const glm::vec3 & c, const std::initializer_list<glm::vec3> & colors) {
    /* ... */
}
但这给了我一个错误:

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

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;
}
void ClassA::createTriangle(int-id,常量glm::vec3&a,常量glm::vec3&b,常量glm::vec3&c,常量glm::vec3&col){
/* ... */
}
int ClassB::createTriangle(常量glm::vec3&a、常量glm::vec3&b、常量glm::vec3&c、常量glm::vec3&color){
返回classCInstance.createObject(std::bind(&classA::createTriangle,std::占位符::1,a,b,c,color));
}
int ClassC::createObject(std::函数f){
f(++id);
返回id;
}
ClassA中还有另一个静态createTriangle函数,具有不同的最后一个参数。这可能是个问题吗?bind不知道要选择哪个createTriangle吗?看起来是这样的:

int createObject(std::function<void(int)>);
createObject(std::bind(&ClassA::createTriangle, std::placeholders::_1, a, b, c, color));
void ClassA::createTriangle(int id, const glm::vec3 & a, const glm::vec3 & b, const glm::vec3 & c, const std::initializer_list<glm::vec3> & colors) {
    /* ... */
}
void ClassA::createTriangle(int-id,const-glm::vec3&a,const-glm::vec3&b,const-glm::vec3&c,const-std::initializer\u列表和颜色){
/* ... */
}

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));
由于您使用的是C++11,因此使用lambda会更愉快:

createObject([=](int id){ return createTriangle(id, a, b, c, color); });

为什么我们不能看到
ObjectInterface::createTriangle
的声明?@Kerrek SB:你现在可以了。为什么要投反对票?太具体了?没有重要信息就无法回答!还原…通常不能绑定重载函数,这只是绑定的一个限制。您可以使用各种方法消除歧义,但这并不值得,lambda只是更简单而已。您确定std::function将使用lambda吗?@TingL:是的,std::function的全部目的是包装任何可调用对象,包括lambda。@gartenriese上次我检查时,如果您有
int createObject(std::function)并用lambda
createObject([=](intid){返回createTriangle(id,a,b,c,color);})调用它,gcc中会有编译错误。@Ting L:我使用了clang,所以关于gcc你可能是对的。哦,你的意思是因为返回?我不使用报税表,朱利安诺一定是偶然添加的。