2015-09-09 44 views
2

我有一个有enum成员的类。这些成员需要输出操作员。我知道如何实现运营商如果enum是类外:enum里面的运算符

enum Type 
{ 
    SMALL=1, 
    MIDDLE=2, 
    LARGE=3 
}; 

std::ostream& operator<<(std::ostream& out, const Type value){ 
    static std::map<Type, std::string> strings; 
    if (strings.size() == 0){ 
     #define INSERT_ELEMENT(p) strings[p] = #p 
     INSERT_ELEMENT(SMALL);  
     INSERT_ELEMENT(MIDDLE);  
     INSERT_ELEMENT(LARGE);    
     #undef INSERT_ELEMENT 
    } 
    return out << strings[value]; 
} 

class House 
{ 
public: 
    Type houseType; 
    ... 
}; 

int main(int argc, char** argv){ 
    House myhouse; 
    std::cout << "This house is " << myhouse << std::endl; 
    return 0; 
} 

是否有可能与enum类里面做呢?我以类似的方式尝试,但显然失败,因为类内的运算符不允许第二个参数。

回答

2

您可以再次定义operator<<,但基本上让它从House直通到Type

std::ostream& operator<<(std::ostream& out, const House& value) 
{ 
    out << value.houseType; 
    return out; 
} 

Working demo

4

是否有可能与类中枚举办呢?

是的,它的工作方式完全一样。您只需要使用范围解析运算符,因为在这种情况下,枚举不再处于全局范围内:

std::ostream& operator<<(std::ostream& out, const House::Type value) 
+0

谢谢!现在它编译,但不像我预期的那样工作。我在帖子中编辑了输出操作符,以便您可以看到问题。当enum不在课堂上时,代码的输出是,比如说“这所房子很大”。现在,当我把enum放入课堂时,输出是“This house is 3”。你知道这是什么原因吗? – vargss

+0

我无法重现您的行为。也许这与你将'House'传递给'cout'而不是'Type'的事实有关? – user2079303

+0

事实上,复制过程中产生了一个错误。在我的代码中有std :: cout <<“这个房子是”<< myhouse.houseType << std :: endl;但它与输出格式问题无关。 – vargss