まず第一に、ビットベースの列挙ではなく通常の列挙が必要です。異なる列挙の量が整数型を超えるためです。また、C++11 の型安全性も利用したいと考えていますenum class
。そうするためには、自然な選択は になりますがstd::bitset
、これら 2 つを結び付ける方法がわかりません。
カスタムbitset
が必要でしょうか?そのようなクラスの実装を回避するにはどうすればよいですか?
まず第一に、ビットベースの列挙ではなく通常の列挙が必要です。異なる列挙の量が整数型を超えるためです。また、C++11 の型安全性も利用したいと考えていますenum class
。そうするためには、自然な選択は になりますがstd::bitset
、これら 2 つを結び付ける方法がわかりません。
カスタムbitset
が必要でしょうか?そのようなクラスの実装を回避するにはどうすればよいですか?
es は列挙型のラッパーであるためenum class
、基になる型にキャストできます。また、いくつかのプライベート継承を使用すると、Liskov の原則を気にすることなく、C++ stdlib クラスからいくつかの機能を選択的にインポートできます。構成により、コードがより明確になりました。これらの機能を使用して、ラップできますstd::bitset
。次のコードには機能のサブセットのみが含まれていますが、さらに拡張できます。
最大値に問題があります - 最大値を取得できませんenum class
(または間違っていますか?)。だから私は追加しましEnumTraits
た。クラスを使用する前に、ユーザーは enum の最大値に等しいEnumTraits
const 値で特殊化する必要があります。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
が改善されないため、一部のプログラマーはクラスにラップされた静的マップを使用します。間違いなく良い読書。