2009-03-06 1 views
-2

Если, например, вы собираетесь написать класс типа варианта, вам, естественно, понадобится идентификация того, какой тип носит экземпляр этого класса. Мне интересно, может ли кто-нибудь узнать какую-либо официальную или полуофициальную (де-факто?) Ссылку на все примитивные типы данных, которые могут быть заинтересованы?Фактический список примитивных типов, используемых в C++

Только примитивы и не нужны абстрактные типы, такие как строка или ручка.

Спасибо.

ответ

0

Поиск в Google - это всегда хорошее начало. Here. Теперь разверните свой реальный вопрос.

+1

Да направьте всех на Google Поиск, а не задавайте вопросы по StackOVerflow. Возможно, вы пропустили всю идею, почему мы хотим, чтобы SO, а не Google Search, Группы Google или что-то в этом роде. Во всяком случае, ваша ссылка не настолько хороша в любом случае, не может найти longlong или int64, поэтому я не доверяю списку. -1 – sharkin

+0

longlong и int64 не определены в C++. -1 самостоятельно – jalf

+0

Они являются специфическими для компилятора/архитектуры. Вы говорите о стандарте C++ ISO, о котором я даже не упоминал. – sharkin

0

Используйте любой сторонний вариант.

Все типы данных, которые вы не можете найти в стандарте.

4

Вы считаете, что позволить другой библиотеке сделать тяжелый подъем?

Существует Boost.Variant, что, вероятно, делает то, что вам нужно, полностью проверено, типично и правильно, и довольно эффективно.

Или, если вы хотите, чтобы свернуть свой собственный, используйте Boost.TypeTraits

+0

Спасибо за подсказку, но это учебный эксперимент. – sharkin

0

Вам не нужно ничего знать о типах, если вы используете 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, если вы можете принять, что значение динамически распределено. Я просто хотел показать, что на месте также работает распределение, если вы знаете размер самого большого типа.

Смежные вопросы