听起来很简单,但我无法找到合适的解决方案:对于寄存器分配器,我需要一个从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;
};
答案 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]++;
}
};
它依赖于类型和对象。不是很优雅......