我有一个有两个重载成员的类。一个采用整数,另一个采用一个参数的模板函数。
class MyClass
{
public:
void doSomething(int data){ std::cerr << data;}
template <typename T> doSomething(T &&data){ std::cerr << data;}
};
我想绑定此功能
MyClass myobject;
auto my_bind = std::bind(&MyClass::doSomething, &myobject, 2);
my_bind();
但是这并没有编译,因为编译器无法扣除要调用的函数。
错误:没有匹配函数来调用&#39; bind(未解析的重载函数类型,MyClass *,int)&#39;
我知道我必须施放这个功能。
auto my_bind2 = std::bind(static_cast<void (MyClass::*)(int)>(&MyClass::doSomething), &myobject, 2);
现在它编译并按预期工作。
但是如果我想将它与任何其他参数绑定以调用模板函数呢?这甚至可能吗?我找不到语法。
这不起作用:
auto my_bind3 = std::bind(static_cast<void (MyClass::*)(std::string)>(&MyClass::doSomething), &myobject, std::string("Hello"));
我想避免使用lambdas。我简化了MCVE的代码,但在实际代码中我应该使用成员指针。
感谢您的帮助
答案 0 :(得分:1)
您应该只提供成员函数模板的相关实例化地址:
auto my_bind3 = std::bind(&MyClass::doSomething<std::string&>, &myobject, std::string("Hello"));
//Note the reference here ^^
上述工作原因是std::bind
复制了它的参数,并且由于doSomething
成员函数模板通过转发引用获取其参数,我们需要利用引用折叠
虽然下面的代码片段会“绑定”,但
auto my_bind3 = std::bind(&MyClass::doSomething<std::string>, &myobject, std::string("Hello"));
//Note the absence of a reference here ^^
当你最终打电话给my_bind3()
时,它会失败。
如果您可以使用lambda,请使用它,因为完美的转发将会启动。
auto my_bind4 = [&myobject](){ myobject.doSomething(std::string("\nHullo")); };