我不确定这是否是一件事(说实话我想说不是),但我想知道是否有一种方法可以编写 c++ 函数,以便它可以选择返回哪种类型的对象。
例如,我有一个基类(A
)有 3 个子类(Aa
, Ab
, Ac
)。在工厂(F
)类我有一个std::map<UINT, A*>
拥有许多基于UINT id
。我的目标是编写一个函数,当我传入 id 值时,该函数可以构建并返回正确的对象。
我可能最终会返回指针并克隆它们指向的数据,但我只是好奇上述情况是否真的可能。
Thanks!
C++ 是静态类型的,函数的返回类型must在编译时就知道。从这里就出现了问题:
- 我是否知道每个调用站点上的静态预期返回类型
F
(==这仅取决于constant expression
values)
- 或者它是否取决于某些运行时变量。
对于情况 #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(使用前将#替换为@)