|
|
1
65
这在C++17中很简单。使用std::map+std::any+std::any_cast:
|
|
|
2
40
Blindy的答案很好(+1),但只是为了完成答案:还有另一种方法可以不使用库,通过使用动态继承:
赞成的意见:
欺骗:
因此,如果可以的话,使用boost::any或boost::variant作为默认值,并仅在其他情况下考虑此选项。 要解决最后一个缺点,可以使用智能指针:
然而,还有一个潜在的问题: 它强制您使用new/delete(或make_unique/shared)创建对象。这意味着实际对象是在空闲存储(堆)中由分配器提供的任何位置(大多数是默认位置)创建的。因此,经常查看对象列表的速度不如可能的快,因为 cache misses .
如果您关心尽可能快地循环此列表的性能 (如果没有,请忽略以下内容),那么您最好使用boost::variant(如果您已经知道将要使用的所有具体类型)或使用某种类型擦除的多态容器。
其想法是,容器将管理相同类型的对象数组,但仍然公开相同的接口。该接口可以是一个概念(使用duck类型技术)或一个动态接口(如我的第一个示例中的基类)。 优点是容器将把相同类型的对象保存在不同的向量中,因此遍历它们很快。只有从一种类型转换到另一种类型才不是。 下面是一个示例(图片来自那里): http://bannalia.blogspot.fr/2014/05/fast-polymorphic-collections.html 然而,如果您需要保持对象的插入顺序,那么这种技术就失去了兴趣。 无论如何,有几种可能的解决方案,这在很大程度上取决于您的需求。如果您没有足够的案例经验,我建议使用我在示例中首先解释的简单解决方案或boost::any/variant。 作为对这个答案的补充,我想指出非常好的博客文章,这些文章总结了您可以使用的所有C++类型的擦除技术,并附有评论和优缺点:
|
|
3
19
使用任意一种
http://www.boost.org/doc/libs/1_55_0/doc/html/variant/misc.html#variant.versus-any
编辑:我再怎么强调也不为过,尽管推出自己的解决方案可能看起来很酷,但从长远来看,使用一个完整、正确的实现将为您省去很多麻烦。
这在一般情况下是正确的,但对于构建整个应用程序所基于的低级基本类型,情况更是如此。 |
|
|
4
12
|
|
|
5
4
C++17有一个
对于那些不在C++17上的,
对于那些不使用boost的人,
https://github.com/mapbox/variant
实现了更轻的版本
|
|
|
6
1
您还可以使用void*并使用reinterpret_cast将值转换回正确的类型。这是C语言回调中经常使用的一种技术。
|
|
|
7
0
这是一种天真的做法。当然,您可以添加包装器来取消某些锅炉板代码。
|
|
|
8
-2
工作正在进行中。这种方法的优点是,在执行赋值或下面列出的任何功能时,您不必强制执行任何操作。 截至目前,它可以:
在代码中,我已经在主函数中演示了它当前可以做什么。
|