1

Edit2: 申し訳ありませんが、回答が問題を解決するかどうかを実際に確認せずに重複としてマークされるのは面倒です。提案された SO の回答は、記載されている問題には適合しません。これは、変数の固定数対変数の可変数+整数と整数値の範囲の変数の組み合わせです。それでも正しい方向性を考える場合は、私が述べた問題に対する有効な解決策を提供してください。それができない場合は、単純に重複としてマークしないでください。

ビットマスクを定義する最もエレガントな方法を見つけようとしています。このビットマスクは整数で、マップ上のオブジェクトの可視性を定義します (32 レベルなので、ビット 0..31 は 32 レベルのそれぞれの可視性を定義します)。

私が理想的にしたいこと:

int visibilityMask = CreateVisibilityMask(0..12, 16, 22);

したがって、上記はビットマスクを作成する可変引数関数になります。.. をオーバーロードして、それ自体でビットマスクを作成し、それを他の値と OR 演算する必要があります。

こいつは本当に大変だと思います。しかし、それは不可能ですか?

編集:申し訳ありませんが、この回答があなたが提案した回答と重複していると思われる場合は、私のニーズに応じて他の回答をどのように使用できるかの例を作成してください. 提供された回答では、変数内の範囲と単一の int 値の組み合わせは許可されていません。簡単に解決できると思われる場合は、提供してください。

注:元の質問は、「..」のオーバーロードに関するものでしたが、これは不可能です。これについて説明していただきありがとうございます。

4

2 に答える 2

1

いいえ、しかし、次のようなことができます:

#define bitrange(from,to)  (unsigned(-1) >> from << from << (sizeof(int)-to) >> (sizeof(int)-to)) 

int visibilityMask = bitrange(0,12)  |  1<<16  |  1<<22;

コメント スレッドへの回答 (コメントするには長すぎます)。

私は今、C+11 だけで書いています。ほとんどの場合、複雑なメタプログラミング ライブラリです。

この場合、自分で constexpr 関数を使用します。これは、私が GCC と CLANG (gcc-54648、clang-13970) でいくつかの consexpr バグを報告したにもかかわらずです。

これは、これを行う方法のアイデアを示す迅速で汚いコードでした。そして「こんな感じ」と書きました。これを constexpr で書き直すのは簡単ですが、私はしません。私はこれをOP用に書きました.OPはおそらくC++ 11コンパイラを持っておらず、constexprが何であるかを知らないかもしれません. OPはスタイルガイドについて尋ねていませんでした.彼は解決策を必要としていました. より良い解決策がある場合は、回答を投稿してください。

于 2013-05-03T12:44:22.177 に答える
0

ビットマスクを定義する最もエレガントな方法を見つけようとしています。

代わりにstd::bitsetを検討しますか?

于 2013-05-03T12:15:47.433 に答える