多实例每类型计数器

时间:2012-12-10 16:22:48

标签: c++ templates

听起来很简单,但我无法找到合适的解决方案:对于寄存器分配器,我需要一个从0开始计数的计数器,并在每个分配步骤中递增。

好吧,让我们把它作为一个普遍的问题(不是特定于寄存器分配):我需要一个可以有多个实例的类(这很重要!),并且它有一个模板化的成员函数,它返回一个整数&# 39; s值在每次通话时都在计算。界面应如下所示:

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);  
}

显然,放松了多个实例&#34;要求这可以使用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;
};

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这对我有用:

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

它依赖于类型和对象。不是很优雅......