[英]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.