دي القائمة بحكم الواقع من أنواع بدائية قابلة للاستخدام في C ++

StackOverflow https://stackoverflow.com/questions/618204

سؤال

إذا، على سبيل المثال، كنت أريد أن أكتب فئة نوع المتغير، وسوف تحتاج بطبيعة الحال تحديد ما اكتب مثيل من تلك الفئة يحمل. أنا أتساءل إذا كان أي شخص يعرف أي مسؤول شبه الرسمي أو (دي-الواقع؟) إشارة لجميع أنواع البيانات البدائية واحدة ربما سيكون مهتما؟

والأوليات فقط، وهناك حاجة لأنواع مجردة مثل سلسلة أو <م> التعامل مع .

وشكرا.

هل كانت مفيدة؟

المحلول

والوحيد <م> مسؤول مرجع هي ISO / IEC 14882 ++ C قياسي.

نصائح أخرى

هل تعتبر السماح مكتبة أخرى تفعل رفع الأحمال الثقيلة؟

وهناك Boost.Variant التي ربما لا ما تحتاج إليه، واختبارها بشكل كامل، typesafe وصحيحة وفعالة جدا.

وأو إذا كنت ترغب في القوائم الخاصة بك، استخدم <لأ href = "http://www.boost.org/doc/libs/1_38_0/libs/type_traits/doc/html/index.html" يختلط = "نوفولو noreferrer "> Boost.TypeTraits

وجوجل البحث هو دائما بداية جيدة. هنا . الآن، طرح السؤال الفعلي.

استخدم أي متغير طرف ثالث.

وجميع أنواع البيانات التي يمكن العثور عليها في المعيار.

وأنت لا تحتاج إلى معرفة أي شيء حول أنواع إذا كنت تستخدم 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