8

まず第一に、ビットベースの列挙ではなく通常の列挙が必要です。異なる列挙の量が整数型を超えるためです。また、C++11 の型安全性も利用したいと考えていますenum class。そうするためには、自然な選択は になりますがstd::bitset、これら 2 つを結び付ける方法がわかりません。

カスタムbitsetが必要でしょうか?そのようなクラスの実装を回避するにはどうすればよいですか?

4

1 に答える 1

10

es は列挙型のラッパーであるためenum class、基になる型にキャストできます。また、いくつかのプライベート継承を使用すると、Liskov の原則を気にすることなく、C++ stdlib クラスからいくつかの機能を選択的にインポートできます。構成により、コードがより明確になりました。これらの機能を使用して、ラップできますstd::bitset。次のコードには機能のサブセットのみが含まれていますが、さらに拡張できます。

最大値に問題があります - 最大値を取得できませんenum class(または間違っていますか?)。だから私は追加しましEnumTraitsた。クラスを使用する前に、ユーザーは enum の最大値に等しいEnumTraitsconst 値で特殊化する必要があります。max

#include <bitset>
#include <type_traits>

template<typename T>
struct EnumTraits;

template<typename T>
class EnumClassBitset
{
private:
    std::bitset<static_cast<typename std::underlying_type<T>::type>(EnumTraits<T>::max)> c;

    typename std::underlying_type<T>::type get_value(T v) const
    {
        return static_cast<typename std::underlying_type<T>::type>(v);
    }

public:
    EnumClassBitset() : c()
    {

    }

    bool test(T pos) const
    {
        return c.test(get_value(pos));
    }

    EnumClassBitset& reset(T pos)
    {
        c.reset(get_value(pos));
        return *this;
    }

    EnumClassBitset& flip(T pos)
    {
        c.flip(get_value(pos));
        return *this;
    }
};

enum class BitFlags
{
    False,
    True, 
    FileNotFound,
    Write,
    Read,
    MaxVal
};

template<>
struct EnumTraits<BitFlags>
{
    static const BitFlags max = BitFlags::MaxVal;
};

#include <iostream>

int main()
{
    EnumClassBitset<BitFlags> f;
    f.flip(BitFlags::True);
    f.flip(BitFlags::FileNotFound);
    //f.flip(2); //fails to compile
    std::cout << "Is False? " << f.test(BitFlags::False) << "\n";
    std::cout << "Is True? " << f.test(BitFlags::True) << "\n";
    std::cout << "Is FileNotFound? " << f.test(BitFlags::FileNotFound) << "\n";
    std::cout << "Is Write? " << f.test(BitFlags::Write) << "\n";
    std::cout << "Is Read? " << f.test(BitFlags::Read) << "\n";
}

enum残念ながら s には多くの機能がなく、さらに es を使用する C++11 では状況enum classが改善されないため、一部のプログラマーはクラスにラップされた静的マップを使用します。間違いなく良い読書。

于 2013-06-27T19:05:56.383 に答える