문제
나는 C ++를 배우고 있습니다.u003CType, object> . 불행히도 C ++ 에서이 작업을 수행하는 방법을 알 수 없습니다. 따라서 질문은 기본적으로 다음과 같습니다.
C ++에서 어떻게 사전을 만들까요?
C ++에 '유형'이 없다는 것을 아는 한 어떻게 '유형'을 사용합니까?
위와 동일하지만 '개체'가 있습니다.
감사!
해결책
유형을 단일 객체 인스턴스에 매핑하려고한다고 가정합니다. 이 라인을 따라 무언가를 시도 할 수 있습니다.
#include <typeinfo>
#include <map>
#include <string>
using namespace std;
class SomeClass
{
public:
virtual ~SomeClass() {} // virtual function to get a v-table
};
struct type_info_less
{
bool operator() (const std::type_info* lhs, const std::type_info* rhs) const
{
return lhs->before(*rhs) != 0;
}
};
class TypeMap
{
typedef map <type_info *, void *, type_info_less> TypenameToObject;
TypenameToObject ObjectMap;
public:
template <typename T>
T *Get () const
{
TypenameToObject::const_iterator iType = ObjectMap.find(&typeid(T));
if (iType == ObjectMap.end())
return NULL;
return reinterpret_cast<T *>(iType->second);
}
template <typename T>
void Set(T *value)
{
ObjectMap[&typeid(T)] = reinterpret_cast<void *>(value);
}
};
int main()
{
TypeMap Services;
Services.Set<SomeClass>(new SomeClass());
SomeClass *x = Services.Get<SomeClass>();
}
C ++ 유형에서는 자체적으로 일류 객체가 아니지만 적어도 유형 이름은 고유 할 것이므로 이에 따라 키를 할 수 있습니다.
편집 : 이름은 실제로 고유 한 것으로 보장되지 않으므로 type_info 포인터를 유지하고 이전 방법을 사용하여 비교하십시오.
다른 팁
당신은 아마도보고 싶을 것입니다 STL 맵 템플릿. C ++에는 확실히 유형이 있습니다 (그것 없이는 상속을하기가 어렵습니다). 특정 정의 된 "유형"클래스는 없습니다.
STL에는 두 개의 연관 컨테이너가 있습니다. std::map<K,V> and
STD :: 멀티 맵. 도 있습니다 std::set<V>
어댑터 여야합니다 std::map<V,void>
, 그러나, 따라서 그것은 연관 컨테이너가 아닙니다. 멀티 맵은 맵과 유사하며 동일한 컨테이너 내에서 여러 개의 동일한 키를 허용합니다. 맵과 멀티 맵 유형 요소 모두 std::pair<K,V>
. 다시 말해, std::map<K,V>::value_type == std::pair<K,V>
, 하지만 std::map<K,V>::key_type == K
그리고 std::map<K,V>::mapped_type == V
.
"타입"에 관해서는, 나는 당신이 의미하는 바를 완전히 확신하지 못합니다. 매개 변수화 된 클래스를 의미하는 경우 C ++는이 "템플릿 프로그래밍"또는 "일반 프로그래밍"이라고합니다. 위에서 std::map<K,V>
키 유형과 값 '유형에 대해 k 및 v에 대해 매개 변수화됩니다. C ++는 또한 템플릿 함수를 지원합니다.
template<typename T>
void f(T o);
원시 유형을 포함하여 모든 유형을 매개 변수로 취하는 함수를 선언합니다. C ++는 일반 유형 해상도를 지원하지 않으므로 유형 T가 특정 계층의 유형이어야합니다. 현재로서는 전달 된 유형이 실제로 올바른 계층 구조라고 가정하면 해당 유형의 객체를 통해 미등성 기능을 호출하려고하면 컴파일러가 불만을 제기합니다.
template<typename T>
void f(T o) {
o.do_it();
}
위의는 t가 방법을 정의하는 한 작동합니다. do_it()
.
사전은 나에게 STL지도처럼 들립니다. std::map<K, T>
. 표준 템플릿 라이브러리를 살펴보십시오. 훌륭합니다. ANSI C ++의 일부였습니다. Microsoft는 PJ Plauger의 훌륭한 구현을 가지고 있습니다.