【问题标题】:Can a template parameter be the type of an object that will be known at run-time?模板参数可以是运行时已知的对象类型吗?
【发布时间】:2021-02-27 04:46:31
【问题描述】:

假设我有一个类 Grid,它包含 3 种不同类型的正方形,每种正方形具有不同的功能,所有这些都继承自父类 Square。我想创建一个这样的模板,其中 T1 是当前方块(我的角色所在的)的类型。它可以是 Grid 中的任何正方形,但只有在调用函数时才知道。

template <typename T1, typename T2> void Grid::move(T1 current_square, T2 new_square){...}

【问题讨论】:

  • 为什么要创建模板?对你有什么好处?这感觉就像您对每种类型的正方形都有专门化的情况,或者您可以简单地使用Square& 参数。在任何一种情况下,模板都不是工作的正确工具。你能在保持抽象的同时更详细地说明这个函数的目的吗(没有太多的实现细节)?
  • @JaMiT 我在这方面做了更多工作,确实,模板无济于事。本质上,我希望我的函数访问仅属于 3 个正方形中的 2 个的成员(因此它不在父类中)。如果我只使用Square&,它会给我一个Square has no member named..error。我想我将只实现一个虚函数,它将从 2 个方格返回我想要的成员,并且在第 3 种类型上什么也不做,尽管我希望有一个更优雅的解决方案。

标签: c++ oop templates inheritance


【解决方案1】:

不,模板类型必须在编译时解析。您需要将它们都设为 Square&,但您需要通过某种方式让对象告诉您它是什么类型的 Square。

【讨论】:

  • 是的,据我所知,没有返回多态对象类型的函数。我可以使用动态转换执行 3 个 if 语句来查看它是什么类型的正方形,但它看起来像是不可靠的代码。如果我有 20 种正方形而不是 3 种呢?
  • 嗯,这就是虚函数的用途。
猜你喜欢
  • 2012-10-25
  • 2019-09-23
  • 2013-07-21
  • 2021-04-10
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 2018-10-25
  • 2018-02-12
相关资源
最近更新 更多