C++ 动态返回类型

2024-04-16

我不确定这是否是一件事(说实话我想说不是),但我想知道是否有一种方法可以编写 c++ 函数,以便它可以选择返回哪种类型的对象。

例如,我有一个基类(A)有 3 个子类(Aa, Ab, Ac)。在工厂(F)类我有一个std::map<UINT, A*>拥有许多基于UINT id。我的目标是编写一个函数,当我传入 id 值时,该函数可以构建并返回正确的对象。

我可能最终会返回指针并克隆它们指向的数据,但我只是好奇上述情况是否真的可能。

Thanks!


C++ 是静态类型的,函数的返回类型must在编译时就知道。从这里就出现了问题:

  1. 我是否知道每个调用站点上的静态预期返回类型F(==这仅取决于constant expression values)
  2. 或者它是否取决于某些运行时变量。

对于情况 #1,函数模板为F将是一个很好的方法。
但就你而言,你似乎面临#2(因为你想返回一个类型,具体取决于ID我们可以假设这不是一个常量表达式)。

由于静态类型,如果您要编写一个函数(假设您没有重载它,因为看起来您的输入参数始终相同),它将有一个single和明确定义的返回类型。基本上,你没有语法来说明你的工厂F将返回一个Aa Ab or Ac(对于静态类型及其支持的所有编译器验证而言,这是一件非常好的事情;)

C++ 解决方案:类型擦除

话虽如此,您有几种方法可以类型擦除,这将允许您返回隐藏在公共单一类型后面的变体类型的实例。

  • 最明显的一个是派生指针到基址指针的转换。如果您打算主要通过返回的对象来使用它,那么它特别有用A接口(即,您将调用定义在A).

    A* F(ID aId)
    

    This A*可以指向派生自的任何类型A。从这里,您可以调用定义在的每个函数A返回指针上的公共接口。当然,如果您想调用仅在子类上可用的操作,您需要知道调用站点上的确切类型是什么,然后将指针强制转换为派生指针,然后才能调用手术。

  • 如果您想避免动态内存,可能的替代方案是boost::variant。代价是必须显式列出函数可以返回的所有可能类型。

    boost::variant<Aa, Ab, Ac> F(ID aId);
    

    你可以看一下教程 http://www.boost.org/doc/libs/1_59_0/doc/html/variant/tutorial.html快速介绍语法和功能。

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

C++ 动态返回类型 的相关文章

随机推荐

  • 如何提高派生类中属性的变化?

    我该如何提高PropertyChanged for SomeProperty在班上B 此示例无法编译 因为PropertyChanged无法通过这种方式访问 public class A INotifyPropertyChanged pub
  • 单元测试 Laravel FormRequest

    我正在尝试对各种自定义进行单元测试FormRequest输入 我找到的解决方案是 建议使用 this gt call 方法并断言response与预期值 答案链接 https stackoverflow com questions 2979
  • 需要帮助使用 Google Apps 脚本查找 Google 表格中的列中的最大值

    我有一张有几千行和两列的工作表 我需要编写一个脚本 该脚本将增加行并将其中一列中的值与同一列中的前 50 个值进行比较 并查看它是否大于前 50 个条目的最大值 我一直在尝试使用 Math max 但找不到正确的语法来使其在动态范围内工作
  • 如何获取文件目录的绝对路径?

    如何获取包含指定文件的目录的绝对路径 current dir is home me dev File file new File target test txt assert absolute file equals home me dev
  • 对三元运算符语句中的“意外 T_ECHO”进行故障排除

    DAO gt get num rows 1 echo is echo are 这似乎没有按预期为我工作 我收到错误 Unexpected T ECHO 我希望它能回应 是 或 是 我已经尝试过 条件周围没有括号 我是否无法以这种方式使用三元
  • 如何更改Vuforia AR相机对焦模式?

    我在用Vuforia 6 2 AR SDK对于在Unity中 但是当我在 Android 手机中测试该应用程序时 相机看起来像blurry 我在 Vuforia 的开发者网站中搜索并找到了一些相机对焦模式 但我无法实现 因为该指南适用于较旧
  • 何时使用 Hibernate 投影?

    我对 Hibernate 有点困惑预测 and criteria 何时使用预测以及何时使用标准 它们并不相互排斥 您可以同时使用两者 预测通常在某些标准的背景下使用 简而言之 Hibernate Projections 用于仅查询您使用 C
  • 无法在 Python 中分配 1.6 GB

    这段代码产生一个MemoryError from pylab import complex128 import numpy x numpy empty 100000000 dtype complex128 100 millions comp
  • 在 os.startfile() 中运行时隐藏控制台?

    我有一个 bat带有参数的文件 我使用运行它os startfile test bat 有没有办法隐藏其控制台 我尝试使用subprocess 效果很好 但是当我关闭父程序时subprocess这是使用编译的py2exe控制台模式也关闭 i
  • TinyMCE有效元素:只允许特定的CSS规则

    小MCE的valid elements属性允许您定义有效 HTML 元素及其属性的白名单 您可以仅允许段落和链接 tinyMCE init valid elements p a href 但是 那style属性有点问题 它对于某些事情 例如
  • SSRS堆叠条形图标签位置

    我正在使用 SQL Server 2012 SSRS 我有一个堆积的条形图 其中包括利息和股息 我想将这些值的总和添加到堆积条形图上方的区域 我尝试过调整标签的各种属性 但我无法将标签位置设置在堆叠条形图中间以外的任何位置 有什么想法如何让
  • 使用 PowerShell 将 Azure 活动日志连接到 Log Analytics 实例

    有没有办法使用 PowerShell 将 Azure 活动日志配置为转发到 Log Analytics 实例 本质上与使用本页概述的门户执行的操作相同 https learn microsoft com en us azure azure
  • 当使用 mkstemp() 创建的文件被删除时?

    我有一个程序调用 mkstemp 用返回的 fd 写入一些内容 然后关闭 fd 我希望保留该文件 直到我自己删除它 使用 rm 命令或其他命令 我的问题是 Linux会在close fd 后删除这个文件吗 Linux在close fd 后会
  • 返回对象的 ECMAScript 6 箭头函数

    当从箭头函数返回一个对象时 似乎有必要使用一组额外的 and a return关键字 因为语法中存在歧义 这意味着我不能写p gt foo bar 但必须写p gt return foo bar 如果箭头函数返回对象以外的任何内容 and
  • jquery 1.9 手风琴高度问题

    我正在使用一个手风琴 其父级高度为 400px 我希望手风琴的高度永远不会大于 400px 但我也希望手风琴的各个元素能够根据其内容的大小进行调整 通过将 heightStyle 设置为 fill 我可以使整个手风琴的高度为 400px 在
  • 模块化编译时数组扩展

    假设我处于这种情况 main c include
  • Rails 3:如何验证 A < B,其中 A 和 B 都是模型属性?

    我想验证一下customer price gt my price 我尝试了以下方法 class Product lt ActiveRecord Base attr accessor my price validates numericali
  • C 结构和 Java 类有什么区别?

    我是 Java 的新手 但对 C 有点熟悉 我想知道 C 结构和 Java 对象以及调用它们的方法之间有什么区别 或者完全等价 例如 自行车结构 class BicycleDemo public static void main Strin
  • 如何在shell中为for循环添加前导零? [复制]

    这个问题在这里已经有答案了 我有一个基本的 for 循环数字 它在每次迭代中将变量 num 加 1 for num 1 num lt 5 num do echo num done 哪个输出 1 2 3 4 5 我试图让它产生输出 在 num
  • C++ 动态返回类型

    我不确定这是否是一件事 说实话我想说不是 但我想知道是否有一种方法可以编写 c 函数 以便它可以选择返回哪种类型的对象 例如 我有一个基类 A 有 3 个子类 Aa Ab Ac 在工厂 F 类我有一个std map