作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用枚举时,我通常会有一些与之关联的辅助方法。对于 C 风格的枚举,我通常这样做:
namespace Colour {
enum Enum { RED, BLUE, GREEN };
string to_string(Enum);
Enum from_string(string const&);
}
C++11 枚举类强制您使用烦人的前缀:
enum class Colour { RED, BLUE, GREEN };
string colour_to_string(Enum);
Enum colour_to_string(string const&);
使用类似命名空间的范围来获得类型安全的选项有哪些?
最佳答案
这是要走的路:
#include <string>
#include <iostream>
enum class Colors{ RED, BLUE, GREEN };
struct myRedStruct{
bool operator==(const Colors& c)const{
if(c == Colors::RED)
return true;
return false;
}
};
namespace ColorsUtils {
using namespace std;
template <typename ColorComparable>
string to_string(const ColorComparable& c){
if(c == Colors::RED)
return "red";
return "not red";
}
Colors from_string(string const&);
}
int main() {
Colors c = Colors::BLUE;
const auto& s = ColorsUtils::to_string(c);
std::cout << s << std::endl;
myRedStruct mrs;
const auto & s2 = ColorsUtils::to_string(mrs);
std::cout << s2 << std::endl;
}
这与您对任何其他用户定义类型所做的几乎相同。试试上面的代码 here .请注意,在该示例中,您可以将任何相等的可比较类型“转换”为字符串。
关于c++ - 类型安全枚举和作用域辅助函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17738121/
我是一名优秀的程序员,十分优秀!