【问题标题】:Can I create a pointer of a type that is determined at run time in C++?我可以创建在 C++ 中运行时确定的类型的指针吗?
【发布时间】:2020-05-31 12:39:34
【问题描述】:

在 C++ 中有没有一种方法(或函数)可以创建在运行时确定的类型的指针。 例子: 有一个 Base 类型的指针 *ptrBase *ptr=new Base(); 假设我们有一个函数getType 能够返回作为其参数传递的指针的类型。 getType(ptr) 返回指针的类型,以便我可以使用它来创建类似类型的指针,例如

getType(ptr) *newPtr=new getType(ptr)();.

C++ 中是否有这样做的?

【问题讨论】:

  • 请记住,C++ 不仅是强类型的,而且是静态类型的:所有类型都必须在编译时可用且已知。根据您的问题,您可以通过标记结构/联合、std::anystd::tuple(或它们的 Boost 等效项)或类似的类型双关或类型擦除技术来解决它。
  • 我能想到的唯一方法是,如果您自己制作课程。具有基类和从基类继承的不同类。然后你可以有一个被每个子类型覆盖的getType 方法。但我认为这不是好习惯。
  • 最接近getType(ptr) *newPtr=new getType(ptr)();. 的方法是实现您自己的继承类,如上所述。然后有一点 if / switch case 来查找它是哪种类型(有限数量的选项)。同样,不建议这样做。
  • 运行时基本上没有类型,它们纯粹是编译时构造。运行时类型系统的唯一(有限)剩余部分是 virtual 函数调度和一些类型信息。顺便说一句:你试图实现的东西被称为“工厂模式”。只需在网上搜索这些关键字即可了解更多信息。此外,这似乎是一个“xy 问题”,您正在询问实际问题的不可用解决方案。

标签: c++ types


【解决方案1】:

是的,有一个符合您要求的简单解决方案。

在您的示例中简单地替换

getType(ptr) *newPtr=new getType(ptr)();

getTypedecltype。就这些。或者,我确实误解了你的问题。

示例代码:

#include <iostream>
#include <string>

int main() {

    std::string answer{};
    int i{};

    // Equivalent to your pseudo code: 
    // getType(ptr)  *newPtr           = new getType(ptr)();

    decltype(answer) *newAnswerPointer = new decltype(answer)();
    decltype(i)      *newIPointer      = new decltype(i)();

    // Assign values to the new types
    *newAnswerPointer = "The answer is: ";
    *newIPointer = 42;

    // Show result
    std::cout << *newAnswerPointer << *newIPointer << "\n";

    return 0;
}

编辑:

我刚刚看到用户“super”也提到了decltype。因为他是第一个。所有功劳归他所有。 . .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2012-03-10
    相关资源
    最近更新 更多