使用 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 检查模板类型 的相关文章

  • 不同翻译单元中字符串文字的内存地址是否相同?

    假设我们有以下 cpp 文件 include
  • 进入嵌入式[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 c11 标准和 clang 来使用 strcpy_s

    我正在运行 OS X Sierra 并尝试编译一个使用的 c 程序strcpy s 但是我安装的 clang 编译器使用的是 c99 标准 但是据我读到的 https embeddedgurus com barr code 2017 08
  • 忽略父进程中的信号

    我正在尝试实现一个 shell 程序 我希望 shell 程序忽略 SIG INT ctrl c 但在我的程序中 子进程也会忽略 SIG INT 信号 但它不应该这样做 因为 exec 应该将子进程带到另一个程序 并且该程序默认情况下应该处
  • 合并多边形的高效算法

    我有一个多边形列表 在这个列表中 一些多边形重叠 或者接触其他多边形 我的任务是合并所有相互重叠或接触的多边形 我有一个union执行此操作的方法 做到这一点最有效的方法是什么 我目前能想到的是循环遍历多边形列表 检查合并列表以查看该多边形
  • 不要覆盖 Azure Blob 存储

    我有一种将文件添加到 Azure Blob 存储的方法 问题是我试图指定一个条件 在该条件下它不会覆盖 blob 而只是添加到其中 我正在尝试使用参数访问条件 但是 VS 说这个方法不能采用两个参数 async void archiveNe
  • 缓存友好的矩阵移位功能

    我想将二维方阵的第一行移到最后一行 所以如果我有一个像A这样的矩阵 我想要得到B 我可以使用两个简单的 for 循环来做到这一点 例如 void shift int M int N int A M N int i j temp for i
  • 隐式转换和编译器的不同行为

    Motivated by this question https stackoverflow com q 51972738 5800831 I created the following code struct X X int struct
  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • 有没有一种方法可以在 TreeView.Nodes 集合中搜索 TreeNode.Text 字段?

    像这样 TreeNode treeNodes treeView Nodes Find searchString true 但我希望它在text字段而不是name field 我不知道有任何内置方法 但你可以使用 LINQ TreeNode
  • 使用 itextSharp 5.3.3 对 Pdf 文档进行数字签名和验证

    我正在尝试使用 iTextSharp 5 3 3 在服务器 c 上进行数字签名和验证 pdf 文档 我使用 DigiSign 在线工具 生成了 Pfx 文件 然后使用 Windows 生成证书 cer 文件
  • 检查字符串中是否存在所有字符值

    我目前正在做这项任务 但我被困住了 目标是读取文件并查找文件中的字符串中是否存在这些字符值 我必须将文件中的字符串与作为参数放入的另一个字符串进行比较 但是 只要每个字符值位于文件中的字符串中 那么它就 匹配 示例 输入和输出 a out
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • IOS Box2D - 身体遵循基于速度波动的点数组的特定路径

    我有一个关于身体的问题 它遵循特定的路径 首先是将身体移动到目标点的方法 const float destinationControl 0 3f b2Vec2 targetPosition path counter b2Vec2 missi
  • 如何获取 EF 中的实体更改增量?

    我只需要获取已更改字段的列表 数据存储区是 ssce 因此没有可用的触发器 EF 是否支持获取列表或构建通用组件 根据上下文的类型和生成的实体 您可以通过多种不同的方式来完成此操作 如果对象继承自 Entity 或 POCO 您可以使用Ob
  • 在运行时生成可执行文件

    好吧 所以我想知道如何创建一个程序 该程序创建第二个程序 就像大多数压缩程序如何创建自解压自可执行文件一样 但这不是我需要的 假设我有 2 个程序 每个都包含一个类 我将使用一个程序来修改类并用数据填充类 第二个文件将是一个也具有该类的程序
  • 如何通过反射获取透明代理的属性值?

    我的代码接收透明代理而不是原始实例 虽然这var type obj GetType 产生原始类的类型 下面的代码抛出TargetException 对象与目标类型不匹配 var value property GetValue obj nul
  • 如何使用 XmlSerializer 生成标记前缀

    我想使用 XmlSerializer 生成以下内容
  • 阅读《Effective、MoreEffective 和Effective Modern C++(和 STL)》的首选顺序是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 据我所知 More effective C 是 Effective C 的扩展 而 Effective Modern C 则专注于 C 11 和
  • 布尔实现的atomicCAS

    我想弄清楚是否存在错误答案 https stackoverflow com a 57444538 11248508 现已删除 关于Cuda like的实现atomicCAS for bool是 答案中的代码 重新格式化 static inl

随机推荐

  • 从 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