我发现了一些与我有关的问题,但他们并没有真正回答我的问题。在Java和C#中,我们有一个“对象”数据类型(或在C#中的“var”),它可以像任何东西一样存储。例如,我想使用一个二维数组,其类型设置为object,所以我也可以在其中存储整数和字符串。但我真的很想念C ++。据我所知,在C ++中有模板,但我真的不知道它们是如何工作的。
template <class T>
T t[] = {1, "2"};
这会出错。我知道列表,但如果可能的话我想使用数组。
答案 0 :(得分:1)
在C#中,每个可以通过引用标识的对象都以相同类型的标头开头,其中包含有关其类型的信息,是否与监视器锁相关联等。这使得可以使用可以使用的方法接收任何类型的引用并对所识别的对象执行某些操作,而不必了解或关注引用的类型。
在C ++中,可能有不具有任何标题的类型 - 只是原始数据。一些这样的类型称为PODS(普通旧数据结构),并且可以支持某些无法与其他类型安全地完成的操作。但是,没有一般概念的共享标题样式的对象。即使许多非PODS类型确实支持至少一个需要某种头的常见功能(能够检查基类指针是否可以安全地转换为派生类对象),但不能保证头包含足以唯一标识对象类的信息。如果X1
和X2
都来自X0
,同样Z1
和Z2
来自Z0
,则实现可以简单地在标题中存储0适用于X0
和Z0
),1适用于X1
和Z1
,2适用于X2
和Z2
。由于X0*
无法识别Z1
,而Z0*
无法识别X1
,因此无需标题区分X1
和Z1
。
因为没有标准头可以唯一地标识对象的类型,所以没有通用的方法让函数接收指向任意未知类型的对象的指针并对它做任何有用的事情。
答案 1 :(得分:0)
这是一小段C ++代码,可以满足您的要求。我认为。 有时只是看到一个例子是有帮助的。我认为网站cppreference.com是你的朋友。有许多很好的例子来说明用法。
#include <iostream>
#include <variant>
#include <array>
int main()
{
// Note this will also work:
// std::variant<int, std::string> t[] = { 1, "2" };
using node = std::variant<int, std::string>;
std::array<node, 2> t = { 1, "2" };
std::cout << "t[0]: " << std::get<int>(t[0]) << std::endl;
std::cout << "t[1]: " << std::get<std::string>(t[1]) << std::endl;
return 0;
}