2012-12-10 37 views
4

听起来像一个简单的,但我不能找到一个合适的解决方案:对于寄存器分配器,我需要一个计数器,从0开始计数,并在每个分配步骤增加。我需要一个可以有多个实例的类(这很重要!),并且它有一个模板化的成员函数,它返回一个整数,这个整数的值正在递增每次通话。接口应该是这样的:放松“多个实例”的要求这可以用一个static int局部变量来实现时多实例每类型计数器

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

很明显:

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

当人们使用它应该发挥这样的计数器。不过,我需要多个实例,并且我认为这会让整个事情变得棘手。

* SOLUTION/EDIT *

我觉得@ 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; 
}; 
+0

是RTTI可用吗? (在我脑海后面的邪恶dynamic_cast的想法) – Najzero

+0

@Najzero如果不使用RTTI会更好。没有它可能吗? – ritter

+0

@chris静态函数如何解决多实例计数器的问题? – ritter

回答

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在编译时推导如果没有调用引用多态对象。

+0

不知道:'std :: type_info'没有实现'std :: map'所需的'operator'' – ritter

+0

@Frank是的,我纠正了我的答案.'type_index'是合适的键类型。 – log0

+0

@ log0你能提供完整的工作代码吗?我在这里看不到对象依赖。 – Felics

1

这个工作对我来说:

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

它的类型和对象而定。不是很优雅...

+0

它当然可以做到这一点。但是你会明白,我给@log0正确的答案,因为它更优雅(正如你所说)。无论如何 – ritter