Я пытаюсь сделать то, что Intellisense делает в визуальной студии, когда вы наводите курсор на побитовое перечисление (или, тем не менее, называемое) (при отладке), перебирая и преобразуя его в строку.C++ Bitflaged enum to string
, например:
#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()' вместо этого? На 1-м взгляде все остальное выглядит хорошо для меня, но я бы использовал операцию с битрейтом, а не «индекс% 2». –
singleFlagToString - это 'std :: function', которая принимает перечисление и преобразует его в' const char * '. цель должна была быть такой общей, насколько я могу, поэтому, если вы заметили, я вызываю «BitwiseEnumToString» со вторым параметром «ColorToString». – ZivS
И как бы вы использовали оператор бит-брейка вместо 'index% 2'? Я могу, вероятно, использовать 'index & 0x1 == 0', но это не смещение битов вправо? – ZivS