使用 typeid 检查模板类型

2023-12-12

我想知道执行以下操作是否安全:

template<class T>
void Parameters::add(Parameter<T> p)
{
   std::string sprobe("");
   int iprobe = 0;
   double dprobe = 0.;

   if (typeid(T) == typeid(sprobe))
     this->mstrings[p.name()] = p;

   if (typeid(T) == typeid(iprobe))
     this->mints[p.name()] = p;

   if (typeid(T) == typeid(dprobe))
     this->mdoubles[p.name()] = p;
}

我有一个用于存储参数的类。它有3个boost::unordered_map成员变量,用于存储int、double和std::string类型的参数;

我创建了一个模板类参数。

我知道如果我的参数不是我预期的 3 种类型之一,这将会失败。但这不是问题,因为我知道参数只能是这些类型。

感谢您的帮助


代码无法编译,但不是因为typeid。问题是即使是正确的if-clauses,你的方法的代码需要被编译——所有的。这与代码的一部分是否被执行(=评估)无关。这导致了一个问题,如果T is int,您仍然需要能够编译其他情况的代码,例如这一行:

this->mstrings[p.name()] = p;

的类型mstrings很可能与通过不兼容Parameter<int> as p,因此你会得到一个编译错误。

解决方案是使用重载,其中每个方法必须只编译一种情况,而不编译其他情况,例如int:

void Parameters::add(Parameter<int> p)
{
    this->mints[p.name()] = p;
}

其他情况也是如此。

最后注意:即使您使用typeid,你不需要探针。你可以简单地使用typeid(int)直接地。

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

使用 typeid 检查模板类型 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • Blade中的Section和Stack有什么区别?

    我们可以使用一个section定义一些 HTML 然后yield那在其他地方 那么为什么我们有堆栈呢 https laravel com docs 5 2 blade stacks https laravel com docs 5 2 bl
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 使用 C# 读取 Soap 消息

  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 从 AJAX 成功功能更新图像源

    我用来更新 AJAX 成功函数中的标签值 如下所示 但我需要知道如何应用此方法来更改 更新某个对象的 src img src ajax url clmcontrol livematchupdate type post dataType js
  • 从 Makefile 运行 go 时权限被拒绝

    我遇到了一些奇怪的权限被拒绝的错误 我不知道这些错误可能来自哪里 go run Hello from go make run go run make go Permission denied make Makefile 2 run Erro
  • 迁移持久存储崩溃

    我有一个开关 可以为 iOS 7 应用程序打开或关闭 iCloud iCloud 同步工作正常 当 iCloud 打开并且我将其关闭时 我调用以下代码 void migrateiCloudStoreToLocalStore NSError
  • 未知属性 Android:Android STUDIO 3.2.1 上出现错误

    我为解决这个问题所做的事情 清洁构建和重建 已删除 idea 文件 无效的缓存 重新启动 选项 打开省电模式 SDK 是最新的 同步项目与 Gradle 文件已完成 重新安装Android Studio完成 重新创建新项目完成 更改了应用程
  • 禁用表中的控件 - JQuery/Javascript

    我有一个复杂的 UI 其中包含多个嵌套表 一个中继器控件和几个其他 HTML 控件 这些控件的禁用属性基于 JQuery 中的业务逻辑进行设置 我需要一种方法来禁用整个表格 包括嵌套控件 UI 元素等 并在用户切换按钮时重新启用它们 我可以
  • 使用 IComparer 进行排序

    我正在尝试使用IComparer对点列表进行排序 这是 IComparer 类 public class CoordinatesBasedComparer IComparer public int Compare Object q Obje
  • Eloquent 中的 IN 语句

    我正在尝试在 Eloquent 查询中执行 IN 语句 我试过这个 id urldecode id news News whereHas newsCategories function q use id q gt where categor
  • Groovy 中的属性注释内省

    有没有一种方便的方法来迭代对象的属性并检查每个属性的注释 你可以这样做 First declare your annotation import java lang annotation Retention RetentionPolicy
  • IIS 反向代理到 node.js

    我正在尝试配置反向代理 以便从 IIS 中托管的网站向 node js 应用程序发出的 HTTP 调用可以正常工作 我会更好地解释它 我租了一个VPS 在此 VPS 中 我有一个 IIS 网站 简单的 HTMl Javascript 和一个
  • 从特定字符开始截断 NSString 的一部分

    我有一根绳子 NSString myOldString This is a string and this part is between brackets 现在 我想以这样的方式截断字符串 基本上括号之间的所有内容 包括括号 都被截断 更
  • Spring Boot:将另一个端口上的请求发送到自定义 Servlet

    我希望我的 spring boot 应用程序侦听第二个端口 其中 第一个 端口是用于 spring webmvc 端点的 server port 并将进入第二个端口上的 的所有流量定向到 Servlet 的实现我已经写了 这些请求将是 js
  • 当选择 p/h:selectOneMenu 中的空 f:selectItem 时,有条件地跳过验证

    父母
  • My.Settings 引用库使用的 app.config 文件的位置?

    如果我有一个类库app config文件 我知道这并不理想 请耐心等待一下 其中包含使用项目 设置 选项卡创建的设置值 并按如下方式访问 Public Shared Function GetMySetting key As String A
  • 我可以使用计时器每 x 毫秒更新一次标签吗

    这是我的代码 Stopwatch timer new Stopwatch timer Start while timer ElapsedMilliseconds lt 3000 label1 Text Convert ToString ti
  • 如何在 conda 环境中安装已弃用/不受支持的 Python 3.4?

    自 Python 3 4 弃用以来 conda 已将其从包列表中删除 但是 有什么方法可以安装它吗 我需要它才能使用用旧版本编写的软件 编辑 我的问题与建议重复一份 因为我指的是已弃用和不受支持的版本 我已经知道如何使用特定的 python
  • 同时交换两个片段

    在我的应用程序中 我有一个活动 并且在运行时添加两个片段 我需要同时交换这两个片段 片段 1 包含一个按钮 我希望当我单击该按钮时 片段 1 移动到屏幕的右侧 而其他片段移动到活动的左侧 在按钮的 onClick 方法中我尝试了这样的方法
  • 使用 ggplot2 绘制彩色直方图

    我有一个包含值及其相关权重的数据框 我想制作一个直方图 使得每个条形的高度对应于该箱中的值的数量 并且条形的颜色对应于它们的总重量 我怎么做 Example D lt data frame x c 0 39 0 12 0 94 1 67 1
  • ImportError:libnvidia-fatbinaryloader.so.375.39:无法打开共享对象文件:没有这样的文件或目录

    我使用的是 Ubuntu 16 04 Cuda 8 0 和 cudann v5 1 我卸载了 Tensorflow CPU 版本并重新安装了启用的 Tensorflow GPU 按照此处给出的说明进行操作 https alliseesolu
  • iOS从通知中心删除通知[重复]

    这个问题在这里已经有答案了 可能的重复 iOS应用程序 如何清除通知 当我单击它并启动我的应用程序时 有没有办法从通知中心 iOS 5 中删除通知 多谢 Set the applicationIconBadgeNumber你的财产UIApp
  • 使用 typeid 检查模板类型

    我想知道执行以下操作是否安全 template