سؤال

أحتاج إلى تخزين سلسلة من نقاط البيانات في شكل (الاسم والقيمة) ، حيث يمكن أن تأخذ القيمة أنواعا مختلفة.

أحاول استخدام قالب فئة لكل نقطة بيانات.ثم لكل نقطة بيانات أرى ، أريد إنشاء كائن جديد ودفعه مرة أخرى إلى ناقلات.لكل نوع جديد ، أحتاج إلى إنشاء فئة جديدة من القالب أولا.لكن لا يمكنني تخزين الكائنات التي تم إنشاؤها في أي متجه ، لأن المتجهات تتوقع نفس النوع لجميع الإدخالات.لا يمكن تركيب الأنواع التي أحتاج إلى تخزينها في تسلسل هرمي للوراثة.هم لا علاقة لهم.أيضا يمكن أن يكون هناك المزيد من الأنواع التي تم إنشاؤها في المستقبل ، وأنا لا أريد تغيير خدمة التخزين لكل نوع جديد.هل هناك طريقة لإنشاء حاوية غير متجانسة لتخزين هذه الإدخالات?شكرا لك!

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

المحلول

مكتبة Boost قد ربما ما تبحث عنه (زيادة :: أي).يمكنك لفة خاصة بك باستخدام نهج مؤشر ملفوفة إذا لم تتمكن من استخدام دفعة ...

نصائح أخرى

boost::any تم التوصية به بالفعل ، ومع ذلك فهو لأي شيء ، لذلك لا يمكنك توقع الكثير منه.

إذا كنت تعرف الأنواع المختلفة في وقت مبكر، فمن الأفضل استخدام boost::variant.

typedef boost::variant<Foo, Bar, Joe> variant_type;

struct Print: boost::static_visitor<>
{
  void operator()(Foo const& f) const { f.print(std::cout); }

  template <class T>
  void operator()(T const& t) const { std::cout << t << '\n'; }
};

void func(variant_type const& v) // not template
{
  boost::apply_visitor(Print(), v); // compile-time checking
                                    // that all types are handled
}

المشكلة مع حاويات مثل هذا هو أنه عندما تريد الوصول إلى شيء في الحاوية، يجب عليك تحديد نوعه ثم يلقيه إلى النوع الفعلي بطريقة أو بأخرى.هذا هو القبيح وغير الفعال والخطأ عرضة، وهذا هو السبب في أن الاختيار رقم 1 في C ++ هو استخدام الميراث، إلا إذا كان لديك سبب وجيه للغاية لعدم - شيء لم أقوم به فعليا في حياتي C ++.

كنت أفكر في أنك قد يكون لديك زوج (اكتب، باطلة *) واكتب وظيفة البوب الخاصة بك التي تلحم الفراغ * اعتمادا على النوع الذي يصف في الزوج ثم يشق هذه في أي حاوية يمسك عينيك.

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