سؤال
لقد كنت تعلم C++, قادمة من C#, حيث اعتدت على استخدام مقدمي الخدمات:أساسا القاموس<Type, object="">.للأسف, أنا لا يمكن معرفة كيفية القيام بذلك في C++.حتى الأسئلة التي هي في الأساس:
كيف يمكنني جعل القاموس في C++.
كيف يمكنني استخدام 'نوع' مع ذلك ، بقدر ما أعرف لا يوجد 'نوع' في C++.
نفس أعلاه, ولكن مع 'الكائن'.
وذلك بفضل!
المحلول
أفترض أنك تحاول خريطة نوع واحد يعترض سبيل المثال.قد تتمكن من محاولة شيء على طول هذه الخطوط:
#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, إذا كنت أتذكر بشكل صحيح.