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

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(使用前将#替换为@)

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

  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • 将同一 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