0

序文: 問題を解決するかどうかを実際に確認せずに、回答が重複としてマークされるのは面倒です。以前にこの質問をしたことがありますが、うまくいきませんでした。特に、この質問は、C++ 式テンプレート クラスでの Matlab のコロン : 演算子の実装では回答されません。これは、変数の固定数対変数の可変数+整数と整数値の範囲の変数の組み合わせです。それでも正しい方向性を考える場合は、私が述べた問題に対する有効な解決策を提供してください。それができない場合は、単純に重複としてマークしないでください。

=> 複製ボタンを押す前に、私の質問に答えているかどうかもう一度確認してください。ありがとう。

ビットマスクを定義する最もエレガントな方法を見つけようとしています。このビットマスクは整数で、マップ上のオブジェクトの可視性を定義します (32 レベルなので、ビット 0..31 は 32 レベルのそれぞれの可視性を定義します)。ビットマスク作成ヘルパーは、整数の可変長リストと整数範囲、およびこれらの任意の組み合わせを処理できる必要があります。

たとえば、次のようになります。

int visibilityMask = CreateVisibilityMask([1..12], 16, 22);

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

4

4 に答える 4

1

サリエンの回答によると:

class MaskCreator
{
  public:
    MaskCreator& AddRange(int from,int to){
      for(int i= from; i<=to; ++i){
        m_list.push_back(i);
      }
      return *this;
    }

    MaskCreator& Add(int i){
      m_list.push_back(i);
      return *this;
    }

    MaskCreator& AddMulti( varargstuff ){
      m_list.push_back(i);
      return *this;
    }

    unsigned int GetMask();

  private:
    vector<int> m_list;
}

// usage:
   unsigned int mask = MaskCreator().Add(3).Add(7).AddRange(16,25).AddMulti(28,30,31).GetMask();

明らかに、AddMulti は Add を置き換えることができます。

于 2013-05-03T14:47:15.317 に答える
0

私が思いついたもう 1 つの優れたオプションは、単純に var-arg int リストを次の形式で使用することです。

int mask = getBitMask(1, 4, 6,-10, 15, 20,-24);

次に、引数を処理して負の数値が見つかった場合、これは、最後の数値と現在の数値の絶対値の間のすべてのインデックスが範囲を形成することを意味します。

唯一の欠点は、次のようなことを禁止するセマンティックなコンパイル時チェックがないことです。

int mask = getBitMask(-2, 4, 6); // allthough this may be valid and just mean bit 0 to 2

また

int mask = getBitMask(4, -6, -10); 
于 2013-05-03T17:06:59.020 に答える
0

varargs を使用している可能性があります 私はそれらを頻繁に使用しません ベクトルを含む vararg リストにすることができますか? はいの場合、次のようなことができます:

std::vector<int> SingleIndices( int vararglist)
{
  std::vector<int> vec;
  /// push all ints 
  return vec;
}

std::vector<int> Range(int from, int to)
{
  std::vector<int> vec;
  for(int i= from; i<=to; ++i){
    vec.push_back(i);
  }
  return vec;
}


int CreateVisibilityMask( vectorvarargs );

//usage:
unsigned int mask = CreateVisibilityMask(Range(1,5),SingleIndices(8,9,23), Range(25, 30));

まったく、これは過度に設計されており、あまり効率的ではないようです。

于 2013-05-03T14:38:15.020 に答える