簡単なように聞こえますが、これに対する適切な解決策を見つけることができません。レジスタ アロケータの場合、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;
};