سؤال

لقد كنت تعلم C++, قادمة من C#, حيث اعتدت على استخدام مقدمي الخدمات:أساسا القاموس<Type, 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 المؤشرات واستخدام قبل طريقة المقارنة بينها.

نصائح أخرى

ربما كنت تريد أن ننظر إلى المحكمة الخاصة بلبنان قالب خريطة.C++ بالتأكيد لديها أنواع (من الصعب أن يكون الميراث دون ذلك), مجرد لا يعرف "نوع" الطبقة.

المحكمة الخاصة بلبنان اثنين النقابي الحاويات: std::map<K,V> andالأمراض المنقولة جنسيا::multimap.هناك أيضا std::set<V> التي ينبغي أن تكون محول من std::map<V,void>, ولكن على هذا النحو ليس النقابي الحاوية.على multimap يشبه خريطة, إلا أنه يسمح متعددة متطابقة مفاتيح في نفس الحاوية.كل خريطة multimap عقد العناصر من نوع 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++ لفترة من الوقت.مايكروسوفت لديها لطيفة التنفيذ من PJ Plauger, إذا كنت أتذكر بشكل صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top