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 #.


  • Mod

    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


Anmelden zum Antworten