gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:09:20 25 4
gpt4 key购买 nike

我有这个枚举类型来确定对象 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按值,不能绑定(bind)到 operator<< 签名中的可变引用.您需要更改 fooStatus&const fooStatus&在你的 operator<< 过载中, 它将正确绑定(bind)。

#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;
}

关于c++ - 静态方法不会调用枚举的内联 basic_stream << 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21262121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com