- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当您将鼠标悬停在按位枚举(或它的名称)变量(调试时)上时,我正在尝试通过采用枚举并将其转换为字符串来执行 Intellisense 在 visual studio 中所做的事情。
例如:
#include <iostream>
enum Color {
White = 0x0000,
Red = 0x0001,
Green = 0x0002,
Blue = 0x0004,
};
int main()
{
Color yellow = Color(Green | Blue);
std::cout << yellow << std::endl;
return 0;
}
如果将鼠标悬停在黄色
上,您将看到:
所以我希望能够调用类似的东西:
std::cout << BitwiseEnumToString(yellow) << std::endl;
并打印输出:Green |蓝色
。
我写了以下内容,试图提供一种打印枚举的通用方法:
#include <string>
#include <functional>
#include <sstream>
const char* ColorToString(Color color)
{
switch (color)
{
case White:
return "White";
case Red:
return "Red";
case Green:
return "Green";
case Blue:
return "Blue";
default:
return "Unknown Color";
}
}
template <typename T>
std::string BitwiseEnumToString(T flags, const std::function<const char*(T)>& singleFlagToString)
{
if (flags == 0)
{
return singleFlagToString(flags);
}
int index = flags;
int mask = 1;
bool isFirst = true;
std::ostringstream oss;
while (index)
{
if (index % 2 != 0)
{
if (!isFirst)
{
oss << " | ";
}
oss << singleFlagToString((T)(flags & mask));
isFirst = false;
}
index = index >> 1;
mask = mask << 1;
}
return oss.str();
}
所以现在我可以调用:
int main()
{
Color yellow = Color(Green | Blue);
std::cout << BitwiseEnumToString<Color>(yellow, ColorToString) << std::endl;
return 0;
}
我得到了想要的输出。
我猜我找不到任何关于它的信息,因为我不知道它的名字,但无论如何 -
在 std 或 boost 中有什么东西可以做到这一点或可以用来提供这个吗?
如果不是,做这样的事情最有效的方法是什么? (或者我的就够了)
最佳答案
您将必须维护枚举的字符串表示列表,无论是在 vector 中,还是硬编码等。这是一种可能的实现方式。
enum Color : char
{
White = 0x00,
Red = 0x01,
Green = 0x02,
Blue = 0x04,
//any others
}
std::string EnumToStr(Color color)
{
std::string response;
if(color & Color::White)
response += "White | ";
if(color & Color::Red)
response += "Red | ";
if(color & Color::Green)
response += "Green | ";
if(color & Color::Blue)
response += "Blue | ";
//do this for as many colors as you wish
if(response.empty())
response = "Unknown Color";
else
response.erase(response.end() - 3, response.end());
return response;
}
然后按照相同的形式为每个要执行此操作的枚举创建另一个 EnumToStr 函数
关于C++ Bitflaged枚举到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37794287/
这个问题在这里已经有了答案: How to do an integer log2() in C++? (17 个答案) 关闭 7 年前。 您好,是否可以通过某种方式将位标志设置为其实际值?例子 in
我有一个 byte 用于存储位标志。我有 8 个标志(每个位一个),可以分为 4 对 2 个标志,它们是互斥的。我按以下方式排列了位标志: ABCDEFGH 10011000 当标志 B 也被设置时,
我列出了《Programming in Go》一书中的代码。我对其进行了测试,但效果不佳。 error: "not enough arguments in call to BitFlag.String
当我尝试在 macOS Sierra 10.12.6 中使用位标志 v1.0.1 在 Rust 中构建项目时,代码失败并出现以下错误: Compiling bitflags v1.0.1 error:
我是一名优秀的程序员,十分优秀!