문제

예를 들어, 변형 유형 클래스를 작성하려면 해당 클래스의 인스턴스 유형을 자연스럽게 식별해야합니다. 누군가가 관심을 가질만한 모든 원시 데이터 유형에 대한 공식 또는 반 공식 (Facto?) 참조를 알고 있는지 궁금합니다.

프리미티브 만, 그리고 같은 추상 유형이 필요하지 않습니다. 또는 핸들.

감사.

도움이 되었습니까?

해결책

유일한 공식적인 참조는 다음과 같습니다 ISO/IEC 14882 C ++ 표준.

다른 팁

다른 도서관이 무거운 리프팅을하도록하는 것을 고려해 보셨습니까?

거기 있습니다 부스트 그것은 아마도 당신이 필요로하고, 완전히 테스트하고, TypeSafe 및 정확하며, 매우 효율적일 것입니다.

또는 직접 굴려면 사용하십시오. boost.typetraits

Google 검색은 항상 좋은 시작입니다. 여기. 이제 실제 질문을 출시하십시오.

타사 변형을 사용하십시오.

표준에서 찾을 수없는 모든 데이터 유형.

typeid를 사용하는 경우 유형에 대해 아무것도 알 필요가 없습니다.

#include <typeinfo>
#include <iostream>

using namespace std;

struct var_base
{
    const type_info & t;
    var_base(const type_info & t) : t(t) {};

    virtual ~var_base() {};
};

template<class T> struct var : var_base
{
    T value;

    var(T x) : var_base(typeid(T)), value(x) {};
};

struct variant {
    const static int max_size=16;

    char data[max_size];
    var_base & v;

    variant() : v(*(var_base*)data) {
        new (data) var<int>(0);
    }

    const type_info & getType() { return v.t; }

    template<class T> T & get() {
        assert(getType()==typeid(T));
        return static_cast< var<T> &>(v).value;
    }

    template<class T> void set(const T & value) {
            // Compile time assert is also possible here.
        assert(sizeof(var<T>)<=max_size);
        v.~var_base();
        new (data) var<T>(value);
    }
};

main()
{
    variant v;
    v.set<float>(1.2);
    cout << v.getType().name() << endl;
    cout << v.get<float>();
    cout << v.get<int>(); // Assert fails
}

값이 동적으로 할당된다는 것을 수락 할 수 있다면 max_size를 제거 할 수 있습니다. 가장 큰 유형의 크기를 알고 있다면 할당이 작동한다는 것을 보여주고 싶었습니다.

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