将类转换为字符串

4

这是从Herb Sutter的gotw3 (http://www.gotw.ca/gotw/003.htm)中衍生出来的。

使用以下类和FindAddr函数...

using std::string;
using std::list;

class Employee
{
public:
    Employee(const string& n, const string& a) : name(n), addr(a) { }
    string name;
    string addr;
};

string FindAddr(const list<Employee>& l, const string& name)
{
    string addr;
    list<Employee>::const_iterator i = find(l.begin(), l.end(), name);

    if (i != l.end()) {
        addr = (*i).addr;
    }
    return addr;
} 

我遇到了编译错误,因为Employee类没有转换为字符串。 我可以看出这样的转换不一定是明智的,但是为了练习的目的,我添加了一个简单的转换:

string::string(const Employee& e)
{
    return e.name;
}

这让我出现了一个错误:
gotw3.cc:17:9: error: C++ requires a type specifier for all declarations
string::string(const Employee& e)
~~~~~~  ^

我做错了什么?

如果您正在尝试进行类型转换重载,可以参考以下链接:http://www.learncpp.com/cpp-tutorial/910-overloading-typecasts/ - RonaldBarzell
gotw3.cc - 关于Sutter的一些内容? - triclosan
2个回答

14

两件事情:首先,你不能在不修改类定义的情况下向现有类中添加内容。如果你想将一个类转换为std::string(或double或其他类型),你应该定义一个转换运算符:在你的情况下:

TBD

class Employee
{
    //  ...
    operator std::string() const
    {
        return name;  //  Or whatever...
    }
};

其次,在您的情况下,解决方案不是提供隐式转换,而是使用适当匹配器的std::find_if。在C++11中,这可以通过使用lambda来完成,但一般情况下(以及在较旧版本的C++中),您始终可以定义功能类型。对于像这样的情况,其中类具有自然“键”,我可能会添加一些成员类,例如:

class Match : std::unary_function<Employee, bool>
{
    std::string myName;
public:
    explicit Match( std::string const& name )
        : myName( name )
    {
    }
    bool operator()( Employee const& toBeMatched ) const
    {
        return toBeMatched.name == myName;
    }
};

可能需要添加额外的功能类型,以定义键的排序关系或相等性。


是的,那是我的笔误;我会纠正它。感谢您指出。 - James Kanze
谢谢。但是我传递给find_if的Match类中的谓词函数的名称是什么? - William Morris
一个函数对象可以像函数一样被调用;这就是operator()(...)的重载所做的。你不需要传递一个函数给find_if,而是需要传递一个类的实例(例如Match(whatImLookingFor))。 - James Kanze

3

没有class string,有一个class template std::basic_string。

不要修改std命名空间中的任何内容。

为了将类型转换为字符串,您可以添加

Employee::operator std::string()

或定义一个

std::ostream& operator<<( const Employee& em, std::ostream& os ); - 这样您的类型就可以与lexical_cast一起使用。

..但实际上在这里您需要的是std::find_if()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接