如何像C ++中的数组一样实现支持不同类型元素的数据结构?

时间:2017-09-21 15:15:41

标签: c++ algorithm templates data-structures

就像一个数组意味着这个数据结构支持在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

1 个答案:

答案 0 :(得分:4)

您可以使用std::vectorstd::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