2012-12-10 6 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 ? 
}; 

: 인터페이스는 같아야합니다. 그러나 나는 여러 인스턴스가 필요하고, 이것이 모든 것을 까다롭게 만든다고 생각합니다.

* 솔루션/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을

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

typeid이 컴파일시에 도출된다 (++ 11 C) 다형성 객체를 참조 할 때 호출되지 않으면.

+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에 정답을 줄 것을 이해할 것이다. +1 함 – ritter