如何使用模板根据类型将元素添加到各种容器

2024-01-28

我有一个相当愚蠢的问题,但我希望你能帮助我。

我有包含多个向量的类,并且这些向量具有不同的存储类型。

class BaseClass{
  std::string Name;
}

class B : public BaseClass{

}
class C : public BaseClass{

}

class A{
  vector<std::pair<std::string, B>> V1;
  vector<std::pair<std::string, C>> V2;
}

在我的 A 类中,有一个模板函数可以将元素添加到该向量中:

template <class T>  void addElement(T Obj);

我希望这种情况发生:

A a;
B b;
C c;


a.addElement<B>(b) -> then element b is added to vector V1
a.addElement<C>(c) -> then element c is added to vector V2

我想出了这样的事情:

template <class T>  void addElement(T Obj){
  std::pair<std::string, T> AddedPair(Obj.Name, Obj);

   if (typeid(T) == typeid(B)) 
    V1.push_back(AddedPair);

   if (typeid(T) == typeid(C)) 
    V2.push_back(AddedPair);

}

但不幸的是,这段代码无法编译,因为不知何故模板是作为一个整体进行编译的,如果我使用 B 作为模板参数,那么编译器无法将 B 转换为 C,尽管该程序永远不会达到可以发生这种转换的程度:(

您对我如何解决这个问题有什么建议吗?我将不胜感激。


而不是有

template <class T>  void addElement(T Obj);

只需重载该函数即可。那会给你

void addElement(const B& Obj)
{
    V1.push_back({Obj.Name, Obj});
}

void addElement(const C& Obj)
{
    V2.push_back({Obj.Name, Obj});
}

这可以节省您专门化模板或需要 C++17 的所有语法以及if constexpr https://en.cppreference.com/w/cpp/language/if#Constexpr_If在编译时做出决定。


原因

template <class T>  void addElement(T Obj){
std::pair<std::string, T> AddedPair(Obj.Name, Obj);

    if (typeid(T) == typeid(B)) 
        V1.push_back(AddedPair);

    if (typeid(T) == typeid(C)) 
        V2.push_back(AddedPair);

}

不起作用的是每个 if 块中的代码需要有效(即使它永远无法到达),但它不能工作,因为您将在向量中添加不同的类型。if constexpr有帮助,但我发现重载与打字一样多,并使代码不向后兼容。

这意味着您要么必须专门化模板,例如

template <class T>  void addElement(T Obj);

template <>  void addElement(B Obj)
{
    V1.push_back({Obj.Name, Obj});
}   
template <>  void addElement(C Obj)
{
    V1.push_back({Obj.Name, Obj});
}

或使用if constexpr:

template <class T>  void addElement(T Obj){
std::pair<std::string, T> AddedPair(Obj.Name, Obj);

    if constexpr(std::is_same_v<T, B>) 
        V1.push_back(AddedPair);

    if constexpr(std::is_same_v<T, C>) 
        V2.push_back(AddedPair);

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

如何使用模板根据类型将元素添加到各种容器 的相关文章

  • 为什么在 lambda 内部引发异常是 C# 7 的一项功能? [复制]

    这个问题在这里已经有答案了 该语句在 VS2015 中无法编译 但在 VS2017 中可以编译 var example new Action gt throw new Exception 为了支持在 lambda 表达式内抛出异常 必须对
  • C - 计算文件中的单词、字符和行数。字符数

    我必须用 C 编写一段代码 输出给定文件中的字符数 行数和单词数 任务看起来很简单 但我现在真的不确定出了什么问题 所以 这是代码 include
  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • 更改图像颜色与透明背景

    我需要使用 c System Drawings 将透明背景上带有绿色圆圈的图像加载到位图图像中 这是最简单的部分 但是 我需要在将其添加到更大的图像之前更改圆圈的颜色 而不影响周围的透明度 就我而言 我需要将圆圈颜色更改为黄色并将其添加为太
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • C++ 模板参数数量错误(2,应该是 1)

    我使用 C 并行快速排序程序进行了测试 如下所示 首先使用列表作为容器 然后我转移到通用容器类型 但它报告了标题错误 可以帮忙解决这个问题吗 include
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 在链表程序中使用模板时重载 C++ 中的 << 运算符

    我正在尝试实现一个链接列表 但是当我尝试重载 include
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas

随机推荐

  • Google 应用程序引擎上的 Python 线程(或其等效项)解决方法?

    我想制作一个执行以下操作的 Google App Engine 应用程序 客户端发起异步http请求 服务器开始处理该请求 客户端发出 ajax http 请求来获取进度 问题是服务器处理 步骤 2 可能需要 30 秒以上 我知道 Goog
  • 如何在 android 中创建自定义渐变?

    我想知道这种渐变颜色在android中是否可行 如果可以的话怎么办 http www techandall com wp content uploads 2013 10 techandall mobile analytics UI conc
  • ASP.NET MVC:在所有操作上执行代码(全局 OnActionExecuting?)

    是否有一个我可以覆盖的 全局 OnActionExecutingall我的 MVC 操作 无论控制器如何 在被调用时会执行某些操作 如果是这样 怎么办 Asp net MVC3 添加了对全局过滤器 http weblogs asp net
  • 如何以编程方式检测操作系统 (Windows) 何时唤醒或进入睡眠状态

    背景 我儿子喜欢在不应该使用笔记本电脑的时候使用他的笔记本电脑 我只是想如果我可以编写一个应用程序 每当他打开 关闭笔记本电脑时就会向我发送电子邮件 这会很方便 我什至愿意接受当机器上有网络流量时通知我的东西 Question 如何以编程方
  • BCrypt 性能恶化

    我们在 Jboss 服务器 6 1 中运行三个 Web 应用程序 标准 Spring MVC Hibernate 所有三个应用程序共享一个通用的身份验证方法 该方法被编译为 JAR 并包含在每个 WAR 文件中 我们的身份验证方法使用 or
  • 格式化字母数字字符串

    我有一个包含 16 个字母数字字符的字符串 例如F4194E7CC775F003 我想将其格式化为 F419 4E7C C775 F003 我尝试使用 string Format 0 F4194E7CC775F003 但这不起作用 因为它不
  • Sublime Text 是否支持 CSS/SASS 文件的实时编辑?

    Sublime Text 支持文件实时编辑吗 我正在寻找更好的工作流程 我真的很喜欢 Sublime Text 但最近我被 Codepen io 和 最近测试的 Adobe Brackets 等工具的 实时编辑 功能宠坏了 当我回到 Sub
  • Boost Python 的性能

    我正在做一个项目 正在尝试使用 boost python 当研究如何组织我的 python 界面时 我遇到了一个问题comment https stackoverflow com questions 4774807 how to organ
  • 立即应用用户界面更改

    我正在 Android 上编写一些 ui 屏幕 有时我需要立即查看 ui 更改 但可以在下一个 ui 线程请求中看到该更改 因此 例如 如果我删除屏幕上的一个视图并以编程方式添加另一个视图 然后更改整个视图 使用 viewAnimator
  • 节点的 xlabels 与点中的边缘重叠

    我尝试使用 dot 绘制图表 但遇到以下问题 节点的标签b与边缘重叠a to b 有没有办法以某种方式移动这个标签来避免这种情况 这是我用来生成图像的代码 使用dot digraph A rankdir LR center true mar
  • 是否需要担心“解析器规则中的隐式标记定义”?

    我正在使用 ANTLR 和 ANTLRWorks 2 创建我的第一个语法 我已经完成了语法本身 它识别用所描述的语言编写的代码并构建正确的解析树 但除此之外我还没有开始任何事情 让我担心的是 解析器规则中第一次出现的标记都会用黄色曲线下划线
  • 用 C++ 读取配置 xml 文件

    如何在C 中读取以下配置文件 STL有支持吗 我无法使用其他第三方库
  • 动画 UIButton Down - Xcode

    我想知道当点击时如何使 UIButton 向下动画 IBAction 提前致谢 在你的里面IBAction UIButton button UIButton sender animates button 25 pixels right an
  • 将寄存器加载到自身的指令的目的是什么?

    在查看 Gameboy 的指令集时 我遇到了如下指令 LD A A LD B B LD C C LD D D 每条指令都有自己的操作码这张桌子 http www pastraiser com cpu gameboy gameboy opco
  • Apollo 客户端错误:无法在上下文中找到“客户端”或作为选项传入。将根组件包装在

    我是新来的阿波罗 我目前正在尝试使用 React 和 Apollo 创建一个应用程序 当我启动我的应用程序时 出现以下错误 在上下文中找不到 客户端 或作为选项传入 将根组件包装在 中 或通过选项传递 ApolloClient 实例 Her
  • 64 位 Windows 的 cygwin 1.7.26 中的 rxvt-native 实用程序在哪里?

    我一直在 cygwin 上使用 rxvt native 程序 我安装了 64 位 cygwin 但在其中找不到 rxvt 包 我安装了相同版本的32位cygwin 看起来它仍然存在 有人知道为什么这个软件包不能用于 64 位 cygwin
  • 如果延迟超过 2147483648 毫秒,setTimeout 会立即触发

    问题 If the delay超过 2147483648 毫秒 24 8551 天 该函数将立即触发 Example setTimeout function console log hey 2147483648 this fires ear
  • Jquery,将标题转换为 Slug

    我有一个执行以下操作的 PHP 脚本 它接受一个字符串 例如 This is a Great Blog Post 1 并返回以下字符串 this is a great blog post 1 我不完全是 Jquery 专家 这就是我问这个问
  • Python-MySQL 中的错误处理

    我正在运行一个基于 python Flask 的小型 Web 服务 我想在其中执行一个小型 MySQL 查询 当我获得 SQL 查询的有效输入时 一切都按预期工作 并且我得到了正确的值 但是 如果该值未存储在数据库中 我会收到一个TypeE
  • 如何使用模板根据类型将元素添加到各种容器

    我有一个相当愚蠢的问题 但我希望你能帮助我 我有包含多个向量的类 并且这些向量具有不同的存储类型 class BaseClass std string Name class B public BaseClass class C public