当前位置:  开发笔记 > 编程语言 > 正文

具有值的任意类型的C++关联数组

如何解决《具有值的任意类型的C++关联数组》经验,为你挑选了2个好方法。

在C++中为每个键创建一个具有任意值类型的关联数组的最佳方法是什么?

目前我的计划是创建一个"值"类,其中包含我期望的类型的成员变量.例如:

class Value {

    int iValue;
    Value(int v) { iValue = v; }

    std::string sValue;
    Value(std::string v) { sValue = v; }

    SomeClass *cValue;
    Value(SomeClass *v) { cValue = c; }

};

std::map table;

这样做的缺点是您在访问"值"时必须知道类型.即:

table["something"] = Value(5);
SomeClass *s = table["something"].cValue;  // broken pointer

此外,放入Value的类型越多,阵列就越臃肿.

有更好的建议吗?



1> 小智..:

boost :: variant看起来正是你想要的.



2> Johannes Sch..:

你的方法基本上是正确的方向.您必须知道你投入的类型.您可以使用boost::any,只要您知道自己投入的内容,就可以将任何内容放入地图中:

std::map table;
table["hello"] = 10;
std::cout << boost::any_cast(table["hello"]); // outputs 10

一些答案建议使用boost::variant来解决这个问题.但是它不会让你在地图中存储任意类型的值(就像你想要的那样).您必须事先了解可能的类型集.鉴于此,您可以更轻松地完成上述操作:

typedef boost::variant variant_type;
std::map table;
table["hello"] = 10;
// outputs 10. we don't have to know the type last assigned to the variant
// but the variant keeps track of it internally.
std::cout << table["hello"];

这是因为为此目的的boost::variant重载operator<<.重要的是要理解,如果要保存变体中当前包含的内容,您仍然必须知道类型,如下所示boost::any:

typedef boost::variant variant_type;
std::map table;
table["hello"] = "bar";
std::string value = boost::get(table["hello"]);

变量的赋值顺序是代码控制流的运行时属性,但任何变量的使用类型都是在编译时确定的.因此,如果您希望从变量中获取值,则必须知道其类型.另一种方法是使用访问,如变体文档所述.它的工作原理是因为变量存储了一个代码,该代码告诉它最后分配给它的类型.基于此,它在运行时决定它使用的访问者的过载.boost::variant是非常大的,并不完全符合标准,虽然boost::any是标准兼容的,但即使对于小型也使用动态内存(因此速度较慢.变体可以将堆栈用于小型).所以你必须权衡你使用的东西.

如果你真的想把对象放在它里面,只有它们做某事的方式不同,那么多态是一种更好的方法.您可以拥有一个基类,您可以从中获得:

std::map< std::string, boost::shared_ptr > table;
table["hello"] = boost::shared_ptr(new Apple(...));
table["hello"]->print();

这基本上需要这个类布局:

class Base {
public:
    virtual ~Base() { }
    // derived classes implement this:
    virtual void print() = 0;
};

class Apple : public Base {
public:
    virtual void print() {
        // print us out.
    }
};

boost::shared_ptr是一个所谓的智能指针.如果您将对象从地图中删除,它将自动删除您的对象,而其他任何内容都不再引用它们.从理论上讲,您也可以使用普通指针,但使用智能指针可以大大提高安全性.阅读我链接到的shared_ptr手册.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有