سؤال

أريد الحصول على خريطة تحتوي على نوع مفتاح متجانس ولكن أنواع بيانات غير متجانسة.

أريد أن أكون قادرًا على القيام بشيء مثل (الرمز الزائف):

boost::map<std::string, magic_goes_here> m;
m.add<int>("a", 2);
m.add<std::string>("b", "black sheep");

int i = m.get<int>("a");
int j = m.get<int>("b"); // error!

يمكن أن يكون لدي مؤشر إلى فئة أساسية كنوع البيانات ولكني لا أفضّل ذلك.

لم أستخدم التعزيز من قبل مطلقًا ولكنني ألقيت نظرة على مكتبة الاندماج ولكن لا يمكنني معرفة ما يجب علي فعله.

شكرا لمساعدتك.

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

المحلول

#include <map>
#include <string>
#include <iostream>
#include <boost/any.hpp>

int main()
{
    try
    {
        std::map<std::string, boost::any> m;
        m["a"]  = 2;
        m["b"]  = static_cast<char const *>("black sheep");

        int i = boost::any_cast<int>(m["a"]);
        std::cout << "I(" << i << ")\n";

        int j = boost::any_cast<int>(m["b"]); // throws exception
        std::cout << "J(" << j << ")\n";
    }
    catch(...)
    {
        std::cout << "Exception\n";
    }

}

نصائح أخرى

كيف يمكنني إنشاء <حاوية مفضلة> لكائنات من أنواع مختلفة؟

لا يمكنك ذلك، ولكن يمكنك تزييف الأمر بشكل جيد.في C/C++، جميع المصفوفات متجانسة (أي أن العناصر كلها من نفس النوع).ومع ذلك، مع طبقة إضافية من المراوغة، يمكنك إعطاء مظهر حاوية غير متجانسة (الحاوية غير المتجانسة هي حاوية تكون فيها الكائنات المضمنة من أنواع مختلفة).

هناك حالتان مع حاويات غير متجانسة.

تحدث الحالة الأولى عندما تكون جميع الكائنات التي تريد تخزينها في حاوية مشتقة بشكل عام من فئة أساسية مشتركة.[...]

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

تعزيز :: أي تفعل خدعة بالنسبة لك؟

وشكرا ديفيد، هذا هو ما احتاجه. وهنا يكمن الحل العمل.

#include <iostream>
using std::cout;
using std::endl;

#include <map>
#include <boost/any.hpp>

using boost::any_cast;
typedef std::map<std::string, boost::any> t_map;


int main(int argc, char **argv)
{

  t_map map;
  char *pc = "boo yeah!";

  map["a"] = 2.1;
  map["b"] = pc;

  cout << "map contents" << endl;
  cout << any_cast<double>(map["a"]) << endl;
  cout << any_cast<char*>(map["b"]) << endl;

  return 0;
}

إذا كنت ترغب في مجموعة محدودة من أنواع إلى دعم، Boost.Variant ينبغي أن تفعل خدعة.

وتعزيز أي بالتأكيد يعمل، ولكن أعتقد أن استخدام الباحث لكتابة تقنية كنوع رئيسي خريطة الانصهار هو الحل الأفضل. لا يوجد نوع المحو وربما أسرع

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