수퍼 클래스 Type_Info를 재귀 적으로 확인하십시오
-
12-12-2019 - |
문제
수퍼 클래스의 type_info가 무엇인지 확인하는 방법이 있습니까? 시스템 객체에서는 비트 세트로 식별됩니다.type_info 해시 코드로 식별됩니다.이러한 유형 중 일부는 내 시스템이 동일한 비트에 있다고 생각하는 의미에서 다형성을 가능하게합니다.type_info 모든 클래스 유형에 대해 고유 한 해시 코드를 만듭니다.대신 파생 된 클래스가 수퍼 클래스의 비트 세트를 그렇게 할 수 있도록 :
Component > ISomeInterfaceComponent -> bit = 00001
|
\ ComponentContextA -> bit = ISomeInterFaceComponent bit
|
\ ComponentContextB -> bit = ISomeInterFaceComponent bit
|
\ ComponentContextC -> bit = ISomeInterFaceComponent bit
.
이렇게하면 구성 요소가 포함 된 객체가 처리를 위해 하나의 시스템에 추가해야합니다.
지금 당장 이것은 일어난 일입니다.
Component > ISomeInterFaceComponent -> bit = 00001
|
\ ComponentContextA -> bit = 00010
|
\ ComponentContextB -> bit = 00100
|
\ ComponentContextC -> bit = 01000
.
모든 구성 요소에 대해 서로 다른 시스템을 만드는 것을 요구합니다.
누군가가 내가 이것을 어떻게 달성 할 수 있는지에 대한 포인터를 줄 수 있다면
편집 : 혼란을 방지하기 위해 유형에 대해 비트 세트를 가져 오는 것은 다음과 같습니다. componentTypeManager :: getBit ();
그래서 나는 인스턴스와 함께 작동하지 않습니다.그리고 현재 시스템을 잠금 장치에 보관하고 싶습니다.
해결책
내가 알고있는 자동 방식이 없습니다.그러나 내가 당신을 이해하는 경우, 그것은 약간의 추가 노력을 통해 수행 될 수 있습니다.
'기본'클래스 각각에 대해 자체를 참조하는 TypEndEF를 추가하고 typeid()
에서 대신 사용할 수 있습니다.하위 클래스는 재정의를 선택할 수 있습니다.그들이 그렇게하면, 그들은 자신의 ID를 얻을 것이고, 자녀들은 그들의 가치를 사용할 것입니다.
메모, 다른 해결책은 전혀 typeid()
를 사용하지 않으려는 경우 기본 클래스의 정적 멤버 (또는 멤버 함수)를 사용하여 기본 클래스에 기본 클래스를 가져 와서 바닥에 적절한 값을 반환 한 다음 직접 해당합니다.getbit () 함수.
#include <iostream>
#include <iomanip>
#include <typeinfo>
struct Base1
{
typedef Base1 Base;
};
struct Base2
{
typedef Base2 Base;
};
struct Derived1A : public Base1 { };
struct Derived1B : public Base1 { };
struct Derived2A : public Base2 { };
struct Derived2B : public Base2 { };
template <typename T>
std::size_t getBit()
{
// Do whatever you normally do here, but use T::Base instead of T
return std::hash<std::string>()(typeid(typename T::Base).name());
}
int main()
{
std::cout << std::boolalpha << getBit<Derived1A>() << " == " << getBit<Derived1B>() << " " << (getBit<Derived1A>() == getBit<Derived1B>()) << "\n";
std::cout << std::boolalpha << getBit<Derived2A>() << " == " << getBit<Derived2B>() << " " <<(getBit<Derived2A>() == getBit<Derived2B>()) << "\n";
}
.
다른 팁
파생 된 클래스에 의해 수정되지 않은 기본 클래스 ISomeInterFaceComponent
에서 변수를 만드는 것이 아닙니다 (특별히 원하는 경우가 아닌 경우).형식에 따라 다르지 않고 파생 클래스 유형에 관계없이 비트 값이 같은 에 관계없이 다형성을 원하는 것처럼 들리지 않습니다.앞으로도 특정 파생 유형에 대해 재정의 해야하는 경우 해당 클래스에 대해 특별히 수행 할 수 있습니다.
또는 int (비트 값 - 또는 실제로 어떤 유형이든)를 반환하는 기본 클래스에서 가상 함수를 사용할 수 있으며 동일한 비트 값을 가진 파생 클래스에서 파생 된 클래스에서 단순히 재정의하지 않는 경우기지.
예 :
class ISomeInterFaceComponent {
virtual int GetBit() { return 1;}; // return bit value
};
class ComponentContextA : public ISomeInterFaceComponent {
// Do not override GetBit() - let the base class function get called.
};
.