繁体   English   中英

静态方法不会调用内联的basic_stream <<枚举运算符

[英]static method won't call inline basic_stream << operator of an enum

我有这个枚举类型,它确定对象foo的状态:

enum fooStatus
{
    DOWN = 0,
    TEMPORARY_DOWN = 1,
    UP = 2
};

对于这个fooStatus枚举,我编写了basic_ostream运算符,用于从枚举向后转换为可读形式,以便进行日志记录,如下所示:

template<
    typename CH,
    typename TRAITS
>
inline std::basic_ostream<CH, TRAITS>& operator<<(
    std::basic_ostream<CH, TRAITS>& os,
    fooStatus& status
)
{
    switch (status)
    {
        case DOWN:
            os << "DOWN";
            break;

        case TEMPORARY_DOWN:
            os << "TEMPORARY_DOWN";
            break;

        case UP:
            os << "UP";
            break;

        default:
            os << "UNKNOWN STATUS";
            break;
    }
    return os;
}

现在,这很好用,直到我创建了foo的静态成员函数,在这里我想打印出我存储的所有foo对象的所有状态。

foo.h中:

static std::string get_all_statuses();

foo.cxx:

std::string get_all_statuses() {
    ... 
    std::ostringstream result;
    foreach(foo in fooStorage) { //<-- non c++ simplification
        result << foo->get_status() << ","; /* get_status returns the fooStatus enum type*/
    }
    return result.str();
}

可悲的是,此“ get_all_statuses”静态函数调用返回的字符串包含数字,而不是上面的<<操作符中定义的文本。 将运算符应用于foo成员函数中相同的foo.cxx文件中的成员get_status()函数时,效果很好。 我似乎无法理解这里的一些基础知识,而我的同事也未能找到解决方案。

因此,我的问题是两个:

首先,这种行为背后的确切逻辑是什么? (预期像编译器之类的东西在静态函数编译时不知道内联运算符)

其次,什么是使这项工作按预期进行的最佳实践方法?

大概get_status按值返回fooStatus ,该值不能绑定到operator<<签名中的可变引用。 您需要更改fooStatus&const fooStatus&你的超负荷operator<< ,这将正确绑定。

#include <iostream>

enum fooStatus
{
    DOWN = 0,
    TEMPORARY_DOWN = 1,
    UP = 2
};

template<
    typename CH,
    typename TRAITS
>
inline std::basic_ostream<CH, TRAITS>& operator<<(
    std::basic_ostream<CH, TRAITS>& os,
    const fooStatus& status
)
{
    switch (status)
    {
        case DOWN:
            os << "DOWN";
            break;

        case TEMPORARY_DOWN:
            os << "TEMPORARY_DOWN";
            break;

        case UP:
            os << "UP";
            break;

        default:
            os << "UNKNOWN STATUS";
            break;
    }
    return os;
}

int main()
{
    std::cout << TEMPORARY_DOWN;
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM