-1

我有一堂课(我们称之为myclass)。它的私有成员变量之一是返回类型的std::function调用,它接受两个参数:myfunctorbool

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=from std::string。但我仍然没有找到它。我尝试了许多不同的组合,但没有运气:

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

等等,但编译器(GCC 4.8.0)给了我类似no matches converting to ....

4

1 回答 1

1

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

或者,如果你真的需要返回一个布尔值,你可以将调用包装在一个 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;
}
于 2013-04-27T21:23:41.727 回答