문제

나는 C ++를 배우고 있습니다.u003CType, object> . 불행히도 C ++ 에서이 작업을 수행하는 방법을 알 수 없습니다. 따라서 질문은 기본적으로 다음과 같습니다.

  1. C ++에서 어떻게 사전을 만들까요?

  2. C ++에 '유형'이 없다는 것을 아는 한 어떻게 '유형'을 사용합니까?

  3. 위와 동일하지만 '개체'가 있습니다.

감사!

도움이 되었습니까?

해결책

유형을 단일 객체 인스턴스에 매핑하려고한다고 가정합니다. 이 라인을 따라 무언가를 시도 할 수 있습니다.

#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> andSTD :: 멀티 맵. 도 있습니다 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의 훌륭한 구현을 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top