作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个枚举类型来确定对象 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/
我是一名优秀的程序员,十分优秀!