c ++ - binding operator = std :: string的成员

时间:2013-04-27 21:06:04

标签: c++ functor

我有一个班级(让我们称之为myclass)。其私有成员变量之一是std::function,其返回类型myfunctor称为bool,它有两个参数:

bool
myfunction
    (const std::string & input, std::string & output)
{
    output = input;
}

myclass的构造函数应该接收对输出std::string的引用作为其唯一参数,因此初始化它的方法将是这样的:

myclass::myclass
    (std::string & s)
: myfunctor( std::bind(myfunction, std::placeholders::_1, s) )
{
    return;
}

然而,我希望有一种方法可以直接使用operator=中的std::string 。但我还没有找到它。我没有运气就试过很多不同的组合:

std::bind( (std::string & (std::string::*) (std::string &)) &(s.operator=), placeholders::_1

等等,但编译器(GCC 4.8.0)给了我no matches converting to ...等错误。

1 个答案:

答案 0 :(得分:1)

您需要强制转换才能指定要使用的std::string::operator=的重载(有多个)。此外,您需要成员函数作用于的对象(=成员函数中使用的this指针)。

或者,如果你真的需要返回一个bool,你可以将这个调用包装成lambda:

#include <iostream>
#include <string>
#include <functional>

int main()
{
    std::string mystring;
    std::function<bool(std::string const&)> f =
      [&mystring](std::string const& rhs)->bool { mystring = rhs; return true; };

    f("hello world");

    std::cout << mystring << std::endl;
}

具有显式重载决策的版本:

#include <iostream>
#include <string>
#include <functional>

int main()
{
    // nice C++11 syntax
    using assignment_FPT = std::string& (std::string::*)(std::string const&);
    // in case your compiler doesn't know that yet
    //typedef std::string& (std::string::*assignment_FPT)(std::string const&);

    std::string mystring;
    auto f = std::bind(
      static_cast<assignment_FPT>(&std::string::operator=),
      std::ref(mystring),  // either `ref` or a pointer (or it will be copied)
      std::placeholders::_1);

    f("hello world");

    std::cout << mystring << std::endl;
}