【问题标题】:How to make a raw C++ pointer to point to a template class without specifying the type?如何在不指定类型的情况下使原始 C++ 指针指向模板类?
【发布时间】:2020-11-17 10:10:03
【问题描述】:

我在一个大型代码库的头文件中看到了这一点。当我尝试在源文件中执行此操作时,编译器抱怨。编译器在头文件中没问题的事实仍然很有趣,所以我想知道它是如何以及为什么工作的。这是一个非常复杂的类,所以我无法破译它。

所以这是一个简单的类:

template <typename T>
class Container {
 public:
  Container(T value) : _value(value){};
  T get() { return _value; }
  void set(T value) { _value = value; }

 private:
  T _value;
};

现在在其他一些头文件中,我有这个其他类:

class ContainerFactory
{
  private:
    Containter<int> *_container1{nullptr}; //this will work as expected
    Container *_container2{nullptr}; //this won't work, the compiler will ask for a type
    std::map<Container*, UIControl*> _map; //this won't work either, but it is handy
    //if I have several types of Container.
}

为了向编译器声明_container2,我必须做些什么所谓的“技巧”。我尝试了前向声明,但它显然不起作用。我应该创建另一个派生自Container 的类并做一些额外的事情吗?请指教。谢谢!

【问题讨论】:

  • 类模板不是类型;它们是创建类型的蓝图。您无法形成指向 Container 的指针,因为 Container 不是一种类型,并且永远不可能有 Container 对象指向它。
  • 头文件中的版本可能是:从不包含;在另一个从未实例化的模板中;或者不像你想象的那样与源代码中的版本完全相同
  • @MilesBudnek,我明白你在说什么,但我亲眼看到了代码。它只是一个实现了太多接口的类,比如其中的 5 个,据我所知,它本身就是一个模板类。我想要的是一些完成此任务的骨架代码。
  • @armanali: "我明白你在说什么,但我已经亲眼看到了代码。" 然后通过展示你看到的代码来证明这一点自己的眼睛。您在此处发布的代码无法编译,并且您描述的代码无法编译除非它位于Container 模板本身中。
  • @NicolBolas,如果它是我的代码,我会拥有的:)

标签: c++ templates visual-c++ c++14 c++17


【解决方案1】:

模板是一种生成 C++ 实体(目前是类、函数和变量)的构造。但是模板本身不是它生成的东西;它只是一种生成事物的模式。它是在编译时存在的虚构,而不是存在于内存某处的东西。

所以你不能有一个指向模板的指针,也不能有一个模板的对象。

您可以完成您想要的大致概念,即可以引用某个模板的任何实例化的对象。但这将涉及创建一个类型擦除对象,该对象为访问类型擦除对象提供特定接口。

但是,当您尝试处理的类型由于各种原因无法命名或需要灵活时,通常会使用类型擦除。如果您的类型是具体类型,那么它必须了解它存储的数据;如果没有,它将无法使用getset(因为它们必须返回已知类型)。所以要么你的类型需要是一个模板(因此用户定义它使用哪个Container&lt;T&gt;),或者类型的性质需要定义Container的模板参数。

【讨论】:

  • 那么您将如何修改Container 类来完成它?我想要一个非常简单的例子。 ContainerFactory 也应该被模板化吗?
  • @armanali:我无法提供任何具体细节,因为没有提供任何关于实际情况的具体细节。你为什么需要这个?你打算让它做什么?你打算如何使用这个你不知道类型的对象?等等。
  • 代码实现了一个属性描述符,它定义了一个可以包含任何类型的属性,无论是 int、double 还是 std::string,然后基于这些属性创建 UI。现在 UI 的数据部分包含一个映射,其中键是该属性描述符,值是显示在屏幕上的 UI 控件。由于属性可以是任何类型,这意味着模板的任何特殊化,因此拥有一个可以存储所有内容的地图会更方便。
  • 我修改了我的ContainerFactory 类以使用例更具吸引力。
  • 也许它也可以通过std::variant 实现,但是我正在查看的代码没有使用它......所以我只是想看看它是如何实现的。我要去问问写它的人。
猜你喜欢
  • 1970-01-01
  • 2023-01-23
  • 2012-01-02
  • 2016-07-25
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多