Flags zu String
-
Wie bekomme ich am einfachsten von Flags wie zum Beispiel:
int flags = WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
zum einem String "WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX"?
Sowas wollte ich für Logging / Debugging-Zwecke einsetzen.
-
Vielleicht mit einem Macro und #.
-
bitmask schrieb:
Wie bekomme ich am einfachsten...
Hast du dir bereits Gedanken darüber gemacht, wie man es überhaupt lösen könnte?
-
z.B. so:
#include <iostream> #include <string> #include <windows.h> #define GENERATE_BITFLAGTOSTRINGENTRY(bitFlag) BitFlagToStringEntry(bitFlag, #bitFlag) class BitFlagToStringEntry { public: BitFlagToStringEntry(int bigFlag, const char* pString) : bitFlag_(bigFlag) , pText_(pString) { } int GetBitFlag() const { return bitFlag_; } const char* GetString() const { return pText_; } private: int bitFlag_; const char* pText_; }; template<int ArraySize> std::string ConvertBitFlagsToString(BitFlagToStringEntry(&bitFlagToStringEntries)[ArraySize], int bitFlags) { std::string result; for (int i = 0; i < ArraySize; ++i) { const BitFlagToStringEntry& bitFlagToStringEntry = bitFlagToStringEntries[i]; if (bitFlags & bitFlagToStringEntry.GetBitFlag()) { if (!result.empty()) { result += " | "; } result += bitFlagToStringEntry.GetString(); } } return result; } int main() { BitFlagToStringEntry bitFlagToStringEntries[] = { GENERATE_BITFLAGTOSTRINGENTRY(WS_THICKFRAME), GENERATE_BITFLAGTOSTRINGENTRY(WS_MINIMIZEBOX), GENERATE_BITFLAGTOSTRINGENTRY(WS_MAXIMIZEBOX) }; int bitFlags = WS_THICKFRAME | WS_MAXIMIZEBOX; std::cout << ConvertBitFlagsToString(bitFlagToStringEntries, bitFlags) << '\n'; std::cin.get(); return 0; }
-
trustee- schrieb:
template<int ArraySize> std::string ConvertBitFlagsToString(BitFlagToStringEntry(&bitFlagToStringEntries)[ArraySize], int bitFlags)Völlig Off-Topic: Eine Referenz auf ein Array mit vorgegebener Größe! Oh welche Freude so etwas mal wieder zu sehen!
Leider sieht man bei so etwas oft einen irgendwas*-Parameter, das diese nützliche Information, die in dem Array-Typen eingebettet ist,
einfach unter den Tisch fallen lässt
(zugegeben, macht nicht immer Sinn, aber man darf dort, wo es angebracht ist, ruhig mal ausnutzen, dass manche Arrays auch eine Größe haben) 
Finnegan