从 std::type_info 检索数据类型的大小

2024-04-01

在C++03中,当您使用运算符时typeid http://en.cppreference.com/w/cpp/language/typeid, a 类型信息 http://en.cppreference.com/w/cpp/types/type_info对象被返回。

是否可以仅根据此结果检索给定类型的大小,例如由sizeof http://en.cppreference.com/w/cpp/language/sizeof操作员?

例如:

std::type_info info = typeid(int);
int intSize = sizeof(int);
int intSize2 = info.getSize(); // doesn't exist!

问题是我们使用第三方多数组类,它返回 type_info,但不返回类型的大小。


我能看到的最好的方法(我希望被证明是错误的)是预先注册类型,如下所示:

#include <typeinfo>
#include <iostream>
#include <stdexcept>
#include <map>
#include <vector>

typedef std::map<const std::type_info*, std::size_t> sizes_container; // we cannot use std::type_index, but that's ok - typeid returns const std::type_info&, which refers to an object which lives during the entire lifetime of the program

sizes_container& sizes() // wrapped in a function to avoid static initialization order fiasco
{
    static sizes_container s;
    return s;
}

template<typename T>
void register_size() // Register the type. Can be called multiple times for the same type.
{
    sizes().insert(sizes_container::value_type(&typeid(T), sizeof(T)));
}

class no_such_type : public std::domain_error
{
public:
    no_such_type(const std::string& str) :
        std::domain_error(str)
    {

    }
};

std::size_t get_size(const std::type_info& typeinfo)
{
    sizes_container::iterator it = sizes().find(&typeinfo);
    if(it != sizes().end())
    {
        return it->second;
    }
    else
    {
        throw no_such_type(std::string("No type ") + typeinfo.name() + " registered");
    }
}

int main()
{
    register_size<int>();
    register_size<std::vector<int> >();

    std::cout << get_size(typeid(int)) << "\n" // get the size from std::type_info, possibly at runtime
              << get_size(typeid(std::vector<int>)) << "\n" << std::flush;
    std::cout << get_size(typeid(long)); // if the type isn't registered, the exception no_such_type is thrown
}

可能的输出:

4
24

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'no_such_type'
  what():  No type l registered

如果您可以控制创建数组的方式(例如,使用工厂方法),您可以直接在此处注册类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 std::type_info 检索数据类型的大小 的相关文章

随机推荐

  • Maven 无法找到 AEM 原型

    我已经开始解决这个问题很长时间了 我正在处理 Adob e wknd 项目 但我无法通过这个命令 并且大部分工作都是基于它构建的 mvn archetype generate DarchetypeGroupId com adobe gran
  • Google+ 登录在 Android 片段上无法正常工作

    我正在使用 google 登录我的应用程序 当我使用活动完成它的工作魅力之后 我将代码移动到片段中 之后当我尝试登录 google 时 它不起作用 我必须打开片段活动2 次登录 google 谁能告诉我发生了什么代码片段添加在下面 publ
  • Rails 的问题 has_many 关系

    我正在编写一个应用程序 用户既可以创建自己的页面供人们发帖 也可以关注用户创建的页面上的帖子 这是我目前的模型关系的样子 class User lt ActiveRecord Base has many pages has many pos
  • Java 编译时未在源代码中获取该文件

    最近我遇到了一个 Java 问题 我尝试了在网上找到的一些方法 但没有成功 所以我需要帮助 我在 Eclipse 中有一个 Java 项目 我的主要课程是在src programCode UI Main2 java 在那里面 java我尝试
  • 如何优雅地处理Spring Security中未由ControllerAdvice处理的异常?

    我最近在我的 Spring 4 Hibernate Web 应用程序中实现了 Spring Security 来处理登录 注销和不同的用户角色 经过大量阅读后 它现在看起来工作得很好 但我注意到由于错误的 Spring Security 配
  • 锁定用户位置的 Google 地图

    我希望我的应用程序中的谷歌地图始终以用户为中心 并随着他们当前位置的变化而移动 想想 pokemon go 地图实际上是如何随着用户移动的 我当前的最佳实现只是在每次位置更改时用动画更新相机位置 如下所示 update the locati
  • 为什么 parseInt("014") 结果是 12? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript parseInt 八进制错误的解决方法 https stackoverflow com questions 850341 workarounds for javascript p
  • 如何使用 Flex 更新 MySql 数据库

    刚刚开始使用 Flex 进行开发 我喜欢它 我已经做了一些简单的应用程序来感受它 没有涉及更新文件或数据库 我需要帮助 如何从 Flex 应用程序 将在 Web 服务器中运行 对 MySql DB 进行查询 我没有看到任何重复的问题 抱歉
  • 当视频在视口中时自动播放 flowplayer 视频

    当视频位于视口中时 是否有任何已知的自动播放视频的方法 我使用以下函数来确定元素何时位于视口中 var isScrolledIntoView function elem get the position of the viewport va
  • BeforeClose VBA 事件在 Cancel = True 时关闭工作簿

    我正在尝试编写一个简短的宏 以防止 Excel 工作簿的用户在不保护第一张工作表的情况下关闭工作簿 该代码显示消息框 但随后继续关闭工作簿 根据我的理解 如果 取消 参数设置为 True 则工作簿不应关闭 Private Sub Workb
  • 如何从填充 datetime.time 值的系列中提取小时、分钟和秒

    Data 0 09 30 38 1 13 40 27 2 18 05 24 3 04 58 08 4 09 00 09 本质上我想做的就是将其分成三列 小时 分钟 秒 我已经尝试过以下代码 但似乎没有一个起作用 train sample t
  • Rails 4 - 通过 link_to 传递参数?

    我有一个表单 根据用户单击哪个链接来显示表单 我希望将不同的隐藏参数传递到记录并在提交时保存 有没有一个好的方法来做到这一点 提前致谢 例如 gt set request project true gt set request admin
  • 按键值对 JSON 数据进行排序

    我目前正在从 discogs API mp3 标签数据 获取 JSON 数据 并希望按键值对结果进行排序 在本例中 我试图获取 Guns n Roses 歌曲的数据 输出的第一首歌曲为 1988 年 而数据实际上有 1987 年的记录 我如
  • 如何在 R 中将树转换为树状图?

    如何将树 Java 程序的输出 转换为 R 中的树状图 目前 我正在使用给出的建议将树转换为 Newick 格式here https stackoverflow com questions 2612579 converting a tree
  • maven webapp将jsps放置在/WEB-INF/jsp中

    我继承了一个使用 NetBeans 内部 ant 构建的 Web 应用程序 所有jsp都驻留在 WEB INF jsp web xml 具有指向 WEB INF jsp somefile jsp 的硬编码链接 如何使用 maven war
  • 非调试模式时在 Visual Studio 输出窗口中显示消息?

    在Java中 你可以使用System out println message 将消息打印到输出窗口 Visual Studio 中的等效项是什么 我知道当我处于调试模式时 我可以使用它来查看输出窗口中的消息 Debug WriteLine
  • std::is_same::value 总是 true 吗?

    我继承了一些如下所示的代码 A specializable function for converting a user defined object to a string value template
  • SWT 应用程序中布局的目的是什么?

    SWT 应用程序中布局的用途是什么 因为我们可以在应用程序中省略它 拥有它有什么好处 自动布局比手动 绝对布局需要更少的时间 首先 总体而言 指定具有所需属性的布局比绝对布局更省力 您可以在自动布局中快速添加 移动或删除项目 而无需调整所有
  • Laravel 中的index()”是什么意思?

    我有这个代码 table gt integer card id gt unsigned gt index 在我使用 Laravel 框架创建的表中 只是为了确定index 这是告诉 Laravel 迁移向该列添加索引的方式 以便在搜索该特定
  • 从 std::type_info 检索数据类型的大小

    在C 03中 当您使用运算符时typeid http en cppreference com w cpp language typeid a 类型信息 http en cppreference com w cpp types type in