4

簡単なように聞こえますが、これに対する適切な解決策を見つけることができません。レジスタ アロケータの場合、0 からカウントを開始し、割り当てステップごとにインクリメントするカウンタが必要です。

わかりました、これを一般的な問題にしましょう (レジスタ割り当てに固有のものではありません): 複数のインスタンスを持つことができ (これは重要です!)、呼び出しごとに値がカウントアップされる整数を返すテンプレート化されたメンバー関数を持つクラスが必要です。インターフェイスは次のようになります。

class Counter
{
public:
  template<class T>
  int plus1() {
    // ?
  }
private:
  // what member ?
};

カウンターを使用する場合、次のように機能する必要があります。

int main() {
  Counter a,b;

  assert( a.plus1<int>() == 0);    
  assert( a.plus1<int>() == 1);    

  assert( b.plus1<float>() == 0);  
  assert( b.plus1<float>() == 1);  

  assert( a.plus1<float>() == 0);  
}

明らかに、「複数のインスタンス」の要件を緩和する場合、これはstatic intローカル変数で実装できます。ただし、複数のインスタンスが必要であり、これにより全体がトリッキーになると思います。

*ソリューション/編集*

@log0 が正しい解決策を示したと思います。完全を期すために、完全に機能するC++ 11コードを次に示します(少なくとも機能しているようです):

class Counter
{
public:
  template<class T>
  int plus1() {
    return counters[ std::type_index( typeid(T) ) ]++;
  }
private:
  std::map<std::type_index, int> counters;
};
4

2 に答える 2

3

type_index を使用できます (c++11)

class Counter
{
public:
  template<class T>
  int plus1() {
    return map_[std::type_index(typeid(T))]++;
  }
private:
  std::map<std::type_index, int> map_;
};

typeidポリモーフィック オブジェクトへの参照で呼び出されない場合、コンパイル時に推定されます。

于 2012-12-10T16:35:15.683 に答える
1

これは私のために働く:

class Counter
{
    public:
        template<class T>
        int plus1()
        {
            static std::map<Counter*, int> s_counters;
            return s_counters[this]++;
        }
};

タイプとオブジェクトに依存します。あまりエレガントではありません...

于 2012-12-10T16:37:47.570 に答える