C++ 11列挙型クラスを使用してフラグビットフィールドを作成しようとしています。しかし、いくつかの問題があるテンプレート化列挙型クラス演算子
#include <iostream>
enum class Flags {
one = 1,
two = 1 << 1,
three = 1 << 2,
four = 1 << 3
};
#define _CONVERT(_operator) \
static_cast<T>(static_cast<int>(lhs) _operator static_cast<int>(rhs))
template <typename T>
T operator & (const Flags& lhs, const Flags& rhs) {
return _CONVERT(&);
}
template <typename T>
T operator | (const Flags& lhs, const Flags& rhs) {
return _CONVERT(|);
}
#undef _convert
int main()
{
Flags flag = Flags::one | Flags::two | Flags::three;
if (flag & Flags::two)
std::cout << "Flag has two" << std::endl;
if (flag & Flags::four)
std::cout << "Flag has four" << std::endl;
std::cout << static_cast<int>(flag) << std::endl;
}
:
Flags flag = Flags::one | Flags::two | Flags::three;
は、型を推測することはできません私は、彼らが次のコードのように使用することができますので、事業者の戻り値の型をテンプレート化する方法を探していますであることをFlags
if (flag & Flags::four)
は、私は、テンプレートに新たなんだし、それが共同時にちょっと失われていますbool
するタイプを推測することはできませんメッシュテンプレートの減算メカニズムまた、変換演算子を作成しようとしました。
operator bool(const Flags& flag)
結果はありません。
結果がどのフラグにマップされたいのですか?(現在はその列挙の値にマップされていません!) – Nim
戻り型のテンプレート演算子'Flags :: one.operator&(Flags :: two)' ...おそらく 'Flags演算子&(Flags、Flags)'がほしいと思うでしょう。 –
Jarod42
@Nim 'Flags'は内部的に' int'型ですが、私の考えは、明示的に定義することなく複数の値を保持できるようにすることです。 – thorhunter