就像一个数组意味着这个数据结构支持在O(1)次中返回某个索引的元素。不同的类型意味着内置类型和用户定义的类应该使用引用。
例如,A是使这种结构失效的类。 b,c是不同类的实例。 A应该支持跟进操作:A a(10);//apply for storage of 10 elements
a[0]=120;
a[1]=’a’;
a[2]=”adsad”;
a[3]=b;
a[3]=c;
a[1]=c;
a[2]=123.5;
…
这个问题不是为了实际用途,只是为了好奇心。
现在我知道如何解决这个问题。真的很酷:D
答案 0 :(得分:4)
您可以使用std::vector
或std::array
std::any
进行此操作。
如下所示:
PHP
此代码输出:
std::vector<std::any> many_any(10);
many_any[0] = 120;
many_any[1] = 'a';
many_any[2] = std::string("adsad");
many_any[3] = 123.5;
std::cout << std::any_cast<int>(many_any[0]) << std::endl;
std::cout << std::any_cast<char>(many_any[1]) << std::endl;
std::cout << std::any_cast<std::string>(many_any[2]) << std::endl;
std::cout << std::any_cast<double>(many_any[3]) << std::endl;
这是一个live-example。
120
a
adsad
123.5
是一个异构容器,使用type-erasure来存储任何类型。它是C ++ 17标准的一部分。以下是一系列文章,解释了如何在C ++中实现类型擦除:Type erasure — Part I。
重要提示:如果您确实需要std::any
,请务必仔细考虑。因为它更像是一个“是的,我们可以!”特征,这在纯粹形式中很少有用。其他选项包括在多态设置中存储对象:使用接口(也可以使用类型擦除实现)或变体+访问者。
更新:如果您的编译器不支持C ++ 17,您可以查看Boost's any implementation。