【问题标题】:operator overload to preety print enum class [closed]运算符重载到漂亮的打印枚举类[关闭]
【发布时间】:2018-03-31 22:56:07
【问题描述】:

我正在尝试打印枚举类(将使用某种地图来打印汽车、房屋)。

在下面的代码中,我应该在哪里将函数粘贴到运算符重载

PS:这是一个人为的例子。

#include <iostream>
#include <vector>
#include <memory>

enum class property_type {CAR, HOUSE};

class Property
{
    public:
    virtual property_type type() = 0;
};

class Car : public Property
{
    public:
    Car(std::string name) : mName(name) {}
    std::string mName;
    property_type type() {return property_type::CAR;}
};

class House : public Property
{
    public:
    House(std::string name) : mName(name) {}
    std::string mName;
    property_type type() {return property_type::HOUSE;}
};

class Person
{
    public:
    std::vector< std::shared_ptr<Property> > properties;
};

int main()
{
    Person x;
    auto y = std::shared_ptr<Property>(new Car("my car"));
    auto z = std::shared_ptr<Property>(new House("my house"));
    x.properties.push_back(y);
    x.properties.push_back(z);
    for (auto i : x.properties) {
            std::cout << i->type() << std::endl;
    }
    return 0;
}  

【问题讨论】:

标签: c++


【解决方案1】:

您可能可以使用 X Macro 来使其整洁且可扩展,以备将来使用,如下所示:

#include <iostream>
#include <vector>
#include <memory>

#define PROPERTY_TYPES \
    X(CAR, "A Car") \
    X(HOUSE, "A House") \
    X(ISLAND, "An Island") // <-- add more types

#define X(type, name) type, 
enum class property_type : size_t
{
    PROPERTY_TYPES
};
#undef X

#define X(type, name) name,
const char *property_name[] =
{
    PROPERTY_TYPES
};
#undef X

class Property
{
public:
    virtual property_type type() = 0;
};

class Car : public Property
{
public:
    Car(std::string name) : mName(name) {}
    std::string mName;
    property_type type() { return property_type::CAR; }
};

class House : public Property
{
public:
    House(std::string name) : mName(name) {}
    std::string mName;
    property_type type() { return property_type::HOUSE; }
};

class Person
{
public:
    std::vector< std::shared_ptr<Property> > properties;
};

std::ostream& operator<< (std::ostream& os, property_type type)
{
    os << property_name[static_cast<size_t>(type)];
    return os;
}

int main()
{
    Person x;
    auto y = std::shared_ptr<Property>(new Car("my car"));
    auto z = std::shared_ptr<Property>(new House("my house"));
    x.properties.push_back(y);
    x.properties.push_back(z);
    for (auto i : x.properties)
    {
        std::cout << i->type() << std::endl;
    }
    return 0;
}

演示:https://ideone.com/BqB1x8

输出:

A Car
A House

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多