Blindy的答案非常好(1),但只是为了完成答案:通过使用动态继承,还有另一种方法可以在没有库的情况下完成:

class MyFieldInterface

{

int m_Size; // of course use appropriate access level in the real code...

~MyFieldInterface() = default;

}

template

class MyField : public MyFieldInterface {

T m_Value;

}

struct MyClass {

std::map fields;

}

优点:

>任何C编码器都很熟悉

>它不会强迫你使用Boost(在某些情况下你不被允许);

缺点:

>你必须在堆/免费存储上分配对象,并使用引用语义而不是值语义来操作它们;

>以这种方式暴露的公共继承可能导致动态继承的过度使用,并且与您的类型相关的许多长期问题实际上过于依赖;

>如果必须拥有对象,指针向量是有问题的,因为你必须管理破坏;

因此,如果可以,请使用boost :: any或boost :: variant作为默认值,否则仅考虑此选项.

要修复最后一个缺点,你可以使用智能指针:

struct MyClass {

std::map > fields; // or shared_ptr<> if you are sharing ownership

}

但是,仍然存在一个可能更有问题的问题:

它强制您使用new / delete(或make_unique / shared)创建对象.这意味着实际对象是在分配器提供的任何位置(主要是默认值)的免费存储(堆)中创建的.因此,由于cache misses,经常访问对象列表的速度并不快.

如果你经常关注循环遍历此列表的性能(如果没有,则忽略以下内容),那么你最好使用boost :: variant(如果你已经知道将要使用的所有具体类型)或者使用某种类型擦除的多态容器.

这个想法是容器将管理相同类型的对象数组,但仍然暴露相同的接口.该接口可以是一个概念(使用鸭子类型技术)或动态接口(像我的第一个例子中的基类).

优点是容器将相同类型的对象保存在单独的向量中,因此通过它们很快.只从一种类型到另一种类型不是.

但是,如果您需要保持插入对象的顺序,这种技术就会失去兴趣.

无论如何,有几种可能的解决方案,这在很大程度上取决于您的需求.如果你对你的案例没有足够的经验,我建议使用我在我的例子中首先解释的简单解决方案或者boost :: any / variant.

作为这个答案的补充,我想指出非常好的博客文章,总结了你可以使用的所有C类型擦除技术,评论和优点/缺点:

map std 浮点数索引_C std :: map持有任何类型的值相关推荐

  1. map std 浮点数索引_std:map中的浮点键

    呼如林 因此在使用double作为键时存在一些问题std::map.首先,NaN比它本身少的是一个问题.如果有NaN插入的机会,请使用以下方法:struct safe_double_less {  b ...

  2. map multimapc++_C++的Map和Multimap

    广州C++培训的小编这一期给大家讲Map和Multimap. 6.6 Maps和Multimaps map和multimap将key/value pair当作元素进行管理.他们可根据key的排序准则自 ...

  3. move std 函数 示例_C++11右值引用和std::move语句实例解析(推荐)

    右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践角度讲,它能够完美解决C++中长久以来为人所诟病的临时对象效率问题.从语言本身讲,它健全了C++中的引用类型 ...

  4. jquery中的map()方法与js中的map()方法

    1.jquery中的map()方法 首先看一个简单的实例: $("p").append( $("input").map(function(){ return $ ...

  5. javascript java map_javascript实现java的map对象,js实现new map()

    /* * MAP对象,实现MAP功能 * * 接口: * size()     获取MAP元素个数 * isEmpty()    判断MAP是否为空 * clear()     删除MAP所有元素 * ...

  6. golang 使用map处理多级json后输出map中的数组

    /** @Descripttion:* @version:* @Author: 步荀仙* @Date: 2019-10-30 15:41:34* @LastEditors: 步荀仙* @LastEdi ...

  7. Fastjson 序列化,反序列化Map对象排序问题(字符串转map,map转字符串)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qingfeng812/article/details/61194594 背景 记录项目中遇到的 关于 ...

  8. no match for call to ‘(std::__cxx11::string {aka std::__cxx11::basic_string

    问题:  t->package().ship_id(sqlRow[1]); 其中 ship_id为 结构体package中的string类型. 如下: typedef struct Packag ...

  9. string转map集合_[系列文章] Go - Map 集合

    概述 Map 集合是无序的 key-value 数据结构. Map 集合中的 key / value 可以是任意类型,但所有的 key 必须属于同一数据类型,所有的 value 必须属于同一数据类型, ...

最新文章

  1. MPB:林科院袁志林组-​枫香-真菌互作培养体系构建
  2. java.net.ConnectException: Connection refused 异常
  3. numpy.sum详解
  4. boost::mpi::wait_any相关用法的测试程序
  5. C++中函数模板的用法详细解析
  6. spring常见面试问题_Spring面试问题
  7. mysql数据库日志截断,MySQL基础(十一):查询截取分析
  8. React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)
  9. (42)Xilinx FIFO IP核配置(三)(第9天)
  10. 如何理解《瓦尔登湖》?
  11. 启牛商学院计算机,启牛商学院达摩老师教你三招成为跨界理财达人
  12. LeetCode 49. Group Anagrams
  13. Cronbach’s α?KMO系数?因子载荷?史上最易懂的问卷信效度分析教程!!!(SPSS和AMOS)
  14. 【原创】【2021 android逆向系列】番外:oppo A57手机刷官方纯净版ROM且ROOT
  15. 用C#语言实现记事本(代码)
  16. 多元时间序列因果关系分析
  17. 理解和应用向量积与数量积
  18. Visual Studio日文乱码解决方法
  19. 风起亚洲公共云与VPS比较
  20. Linux之创建组名和删除组名

热门文章

  1. 【七夕特殊礼物】Dubbo学习之SPI实战与debug源码
  2. MyEclipse6.5安装SVN插件的三种方法
  3. 批处理引擎MapReduce程序设计
  4. DocHub v2.3 发布,构建你自己的百度文库
  5. 封装一个方法,找出数组中重复数大于n的元素集合
  6. 对于超平面的理解[转载]
  7. mysql的zip包的安装方法
  8. 国庆七天乐——第三天
  9. 软件测试的学习之路 ------ HTML,CSS里的必备单词
  10. Java 反射(初步)