转换未解析的模板重载的类成员

时间:2017-04-12 10:22:43

标签: c++

我有一个有两个重载成员的类。一个采用整数,另一个采用一个参数的模板函数。

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的代码,但在实际代码中我应该使用成员指针。

感谢您的帮助

1 个答案:

答案 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()时,它会失败。

Demo

如果您可以使用lambda,请使用它,因为完美的转发将会启动。

auto my_bind4 = [&myobject](){ myobject.doSomething(std::string("\nHullo")); };