从基指针向下转换为模板化派生类型

2024-01-10

我有以下层次结构:

class base
{
public:
   virtual ~base(){}
   virtual void foo() {}
};

template <typename T>
class derived1 : public base
{
   virtual void foo() {};
};

template <typename T>
class derived2 : public base
{
   virtual void foo() {};
};

现在给定一个指向基址的指针,我想知道是否 底层是衍生 1 或衍生 2。问题是 派生1和派生2都可以专门用于许多不同的 类型,使用dynamic_cast来测试向下转换需要 要知道的模板类型。我最终得到了一些混乱、无法维护且不完整的代码:

base* b = new derived1<int>();

if (dynamic_cast<derived1<int>*> ||
    dynamic_cast<derived1<unsigned int>*> ||
    dynamic_cast<derived1<double>*>)
  std::cout << "is derived1";
else if (dynamic_cast<derived2<int>*> ||
    dynamic_cast<derived2<unsigned int>*> ||
    dynamic_cast<derived2<double>*>)
  std::cout << "is derived2";

有没有更好的方法可以处理任何类型的专业化?


将依赖于类型的逻辑移至类型中。

代替:

if (dynamic_cast<derived1<int>*>(b) ||
    dynamic_cast<derived1<unsigned int>*>(b) ||
    dynamic_cast<derived1<double>*>(b))
  std::cout << "is derived1";
else if (dynamic_cast<derived2<int>*>(b) ||
    dynamic_cast<derived2<unsigned int>*>(b) ||
    dynamic_cast<derived2<double>*>(b))
  std::cout << "is derived2";

add a virtual print_name() const功能为base,然后执行:

void example() {
    std::unique_ptr<base> b(new derived1<int>());
    b->print_name();
}
class base
{
public:
   ~base(){}
   virtual void foo() {}
   virtual void print_name() const = 0;
};

template <typename T>
class derived1 : public base
{
   virtual void foo() {}
   virtual void print_name() const {
       std::cout << "is derived1";
   }
};

template <typename T>
class derived2 : public base
{
   virtual void foo() {}
   virtual void print_name() const {
       std::cout << "is derived2";
   }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从基指针向下转换为模板化派生类型 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • 以相反的顺序迭代可变参数模板参数

    如果我手动反转传递给它的模板参数的顺序 以下代码将起作用 template
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • 将同一 10 倍数范围内的数组值分组

    我有一个数组 例如 var arr 2 4 7 11 25 608 65 109 99 100 504 606 607 我需要这样做 以便将低于其十的倍数和高于其十的倍数范围内的每个值分组在一起 例如 2 4 7 介于 0 和 10 之间
  • 使用zipfile解压后文件权限丢失

    我已经提取了一个 zip 文件 hisat2 2 2 0 Linux x86 64 zip from https cloud biohpc swmed edu index php s hisat2 220 Linux x86 64 down
  • 如何在我的应用程序中获得与苹果地图相同的搜索提示

    我在 iOS 应用程序中实现了搜索栏 我想获得与 Apple 地图应用程序相同的 部分结果 搜索提示 我试图找出苹果是如何实现它的 但我在谷歌或 stackoverflow 上都没有成功 我的 UITableView searchHintT
  • 使用 Future 和 @Aync 时休眠两个开放会话

    我正在尝试在我的应用程序中使用多线程来执行一些需要几分钟才能完成的任务 我的想法是 我有 n 个对象 所以我希望并行处理这些对象 而不会让用户 网络应用程序 等待它们完成 因为这需要几分钟 另外在其他情况下 当对象的数量为 1 时 我想等到
  • 如何从 NodeJs API 渲染 HTML 页面?

    运行http server后 我尝试访问URL http 127 0 0 1 8080 http 127 0 0 1 8080 但我得到的不是我写的 每次我尝试时 都会显示 Node js v8 11 4 欣喜若狂的服务器正在运行 127
  • WebStorm 将重构范围限制为仅当前文件

    编辑 这是我创建的问题的链接 https youtrack jetbrains com issue WEB 21956 https youtrack jetbrains com issue WEB 21956 是否可以将 WebStorm
  • 如何在 Xcode 中将图像添加到 C++ 项目

    我想在 Xcode 中将图像添加到我的 C 项目中 以便我可以读取该图像并用它执行某些操作 如何将图像包含到我的项目中 尝试将两者复制粘贴到我的项目和包含我的 c 源的文件夹中 在 Xcode 10 中 我无法将图像与可执行文件放在同一文件
  • PyQt 不规则形状的窗口(例如没有边框/装饰的圆形)

    如何在 PyQt 中创建不规则形状的窗口 I found 这个C 解决方案 https stackoverflow com questions 1333610 displaying translucent irregular shaped
  • Electron 主进程和渲染进程调试配置

    我正在使用那个仓库https github com SimulatedGREG electron vue https github com SimulatedGREG electron vue并尝试像这样设置 VS Code 调试配置 ma
  • 将列表元素映射到字典中的键以获取Python中的十进制值

    我有一个单词列表如下 mylist cat yellow car red green jeep rat lorry 我还有数据集中每篇文章的列表列表 其中包含 mylist 的值 如下面的示例所示 即 如果 mylist 单词出现在文章中
  • 使用 makecert 创建证书而不使用 pvk 文件

    我正在尝试创建一个由根密钥签名的证书makecert 我没有PVK文件 只有KEY和PEM文件 我认为 KEY和PEM文件也是私钥 这样对吗 但如果我尝试这个 makecert exe n CN Test Use iv ca key ic
  • 如何配置嵌入式 jetty 服务器来记录所有请求?

    我想将所有肥皂请求记录到我的服务器 服务器实例是嵌入式码头服务器 有没有办法设置处理程序来执行此操作 我可以访问 web xml 文件 您将需要在嵌入式码头启动中执行以下操作 假设 Jetty 9 HandlerCollection han
  • 为什么 IDLE 3.4 在这个程序上花费这么长时间?

    编辑 我正在完全重做这个问题 该问题与 time time 无关 这是一个程序 import time start time time a 9 lt lt 1 lt lt 26 The line that makes it take a w
  • 小型转储中的 .ni.dll 和 .ni.exe 文件是什么?

    由于我的应用程序崩溃 我从 Windows 应用商店应用程序提交过程 由审阅者发送 收到了一个小型转储 我在加载应用程序的符号时遇到问题 因为错误发生在内部App ni exe 一个我不知道从哪里来的文件 我的应用程序只有一个App exe
  • 用不同的颜色为 html 锚点添加下划线

    是否可以使用文本颜色以外的颜色为锚标记添加下划线 任何例子将不胜感激 EDIT 是否可以将颜色指定为十六进制 例如 8f867c 你不能单独指定下划线颜色 但你可以使用一个小技巧 a color red text decoration no
  • 如何为饼图元素设置自定义颜色

    我在我的 Android 项目中使用 MPChart 库 我有 Json 其中包含用于生成饼图的标签 值和颜色 我想从 json 到饼图元素设置相同的颜色 我遵循了 MPChart 文档 但没有找到任何饼图颜色设置的解决方案 您在文档中没有
  • 显示多行python控制台ascii动画

    我正在玩控制台动画 我发现制作一行很容易 但我开始考虑在控制台中将 GIF 动画制作为 ASCII 的想法 import time def main counter 0 while True with open ascii path dog
  • 直观地识别 PDF 表单中的字段名称

    我知道存在一些类似的问题 查找 PDF 文档中可输入表单字段的字段名称 https stackoverflow com questions 3310533 find the field names of inputtable form fi
  • 使用 jQuery 查找可见元素的长度

    大家好 我需要找到仅具有显示块的所有 li 元素的长度 使用 jQuery 怎么可能做到这一点 我有一个类别菜单块 底部有更多链接 单击该链接将显示所有类别 底部链接现在变为 更少 单击该链接将显示更少的项目 这是代码 var list m
  • 从基指针向下转换为模板化派生类型

    我有以下层次结构 class base public virtual base virtual void foo template