保持对C++中任何对象类型的引用?

Tim*_*Tim 9 c++ pointers linked-list object

我正在尝试自学C++,而我一直使用的传统"新语言"练习之一是实现一些数据结构,如二叉树或链表.在Java中,这相对简单:我可以定义一些维护实例变量的类Node Object data,以便有人可以在列表或树的每个节点中存储任何类型的对象.(后来我使用泛型来修改它;这不是这个问题的内容.)

我找不到类似的,惯用的C++方式来存储"任何类型的对象".在C中,我使用void指针; 同样的事情适用于C++,很明显,但后来我碰到的时候我构建的一个实例问题std::string,并尝试将其保存到列表/树(一些关于一个无效的转换,从std::string&void*).有这样的方式吗?C++是否具有Java的Object(或Objective-C的NSObject)的等价物?

奖金问题:如果没有,我需要继续使用无效指针,将"存储"的"正确"方式std::stringvoid*什么?我偶然发现了static_cast<char*>(str.c_str()),但这似乎有点冗长我正在努力做的事情.有没有更好的办法?

Cha*_*via 12

与Java不同,C++没有所有对象继承的基础对象.您想要做的通常做法是使用模板.标准C++库中的所有容器都使用此方法.

与Java不同,C++不依赖于多态/继承来实现通用容器.在Java中,所有对象都继承自Object,因此任何类都可以插入到一个容器中Object.但是,C++模板是编译时构造,它指示编译器为您使用的每种类型实际生成不同的类.所以,例如,如果你有:

template <typename T>
class MyContainer { ... };
Run Code Online (Sandbox Code Playgroud)

然后MyContainer,您可以创建一个带有std::string对象的对象,以及另一个带有ints的MyContainer .

MyContainer<std::string> stringContainer;
stringContainer.insert("Blah");

MyContainer<int> intContainer;
intContainer.insert(3342);
Run Code Online (Sandbox Code Playgroud)

  • 详细说明,Java泛型是一种依赖于继承和多态的运行时机制.C++模板是编译时构造,它指示编译器为每个参数化类型生成代码.有关详细信息,请参阅我编辑的答案 (3认同)
  • @Charles:这就像是说X博士与Mangler博士有比Y博士更多的共同点.这种比较在同一时间没有帮助和误导. (3认同)
  • 并不是的.它们是完全不同的,即使语法表面上是相同的. (2认同)
  • 事实上,不管你信不信,与 Java 泛型相比,C++ 模板与 C 宏的共同点实际上更多。当然,它们比宏更安全、更强大。 (2认同)

par*_*3an 9

你可以看一下boost :: any class.它是类型安全的,你可以把它放到标准集合中,你不需要链接任何库,该类在头文件中实现.

它允许您编写如下代码:

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

typedef std::list<boost::any> collection_type;

void foo()
{
    collection_type coll;
    coll.push_back(boost::any(10));
    coll.push_back(boost::any("test"));
    coll.push_back(boost::any(1.1));
}
Run Code Online (Sandbox Code Playgroud)

完整文档在这里:http://www.boost.org/doc/libs/1_40_0/doc/html/any.html