我試圖通過採取一個枚舉並將其轉換爲字符串,將鼠標懸停在一個按位枚舉(或稱爲)的變量(在調試時)時在Visual Studio中執行什麼操作。C++ Bitflaged枚舉字符串
例如:
#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;
}
如果你將鼠標懸停在yellow
你會看到:
所以我想能夠調用是這樣的:
std::cout << BitwiseEnumToString(yellow) << std::endl;
並輸出打印:Green | Blue
。
我寫了嘗試打印枚舉提供了一個通用的方法如下:
#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;
}
我得到所需的輸出。
我猜,我無法找到任何關於它,因爲我不知道它是怎麼叫呢,但反正 -
有什麼性病或升壓,做這或可用來提供這個?
如果不是,做這種事最有效的方法是什麼? (或將挖掘suffic)
什麼是'singleFlagToString()'?你是不是要調用'ColorToString()'而不是?乍一看,其他一切看起來都不錯,但我會使用一個bitshift操作,而不是'index%2'。 –
singleFlagToString是一個'std :: function',它接受enum並將其轉換爲'const char *'。目的是爲了儘可能通用,所以如果你注意到了,我使用第二個參數「ColorToString」調用「BitwiseEnumToString」。 – ZivS
你將如何使用bitshift運算符而不是'index%2'?我可以使用'index&0x1 == 0',但它不是正確的? – ZivS