C/C++技巧:为多个不同的类型定义一个统一的类型

C/C++ trick: define a unified type for multiple different types?

本文关键字:类型 一个 定义 技巧 C++      更新时间:2023-10-16

我正在研究一些编译器的东西,我有多种不同的类型:

Box*
BoxedInt*
BoxedString*
...

它们基本上都是指向不同对象的指针,我想创建一个统一的类型,称为 ObjectPointer,可以表示所有这些指针类型。我倾向于使用void *因为我不想到处都有演员表。我能做什么?我可以做这样的事情吗:

typedef Box*      ObjectPointer
typedef BoxedInt* ObjectPointer
....

或者还有其他方法可以做到这一点?我只是想要这些指针的algebraic data type类似的东西。顺便说一下,我正在使用clang.

我打算将新类型ObjectPointer用作通常的类型。它不应该是一个类、结构或联合。假设我有一个函数Box* add(BoxedInt* lhs, BoxedInt rhs)更改后它应该只是ObjectPointer add(ObjectPointer lhs, ObjectPointer rhs).

C 中,您可以使用 union 类型,其中包含上述所有元素的指针:

union UnifiedType {
  Box* boxPtr;
  BoxedInt* boxedIntPrt;
  BoxedString* boxedStringPtr;
};

在这里查看更多。

不过,在C++中,您可以对所有描述的类型使用(如果需要,可以抽象)超类,并将它们设置为它的扩展。然后,可以根据需要使用基类指针。在这里查看更多。

class BoxedBase { /*....*/ }
class Box : public BoxedBase { /*....*/ }
class BoxedInt : public BoxedBase { /*....*/ }
class BoxedString : public BoxedBase { /*....*/ }

然后,您可以按如下方式typedef指针:

typedef BoxedBase* ObjectPointer

您不能定义"这个东西可以容纳任意数量的不相关类型"。 但是,如果关联类型(使用基类),则可以改用多态性。

class Object { ... }
class Box : public Object { ... }
class BoxedInt : public Object { ... }
...
typedef Object * ObjectPointer;

从问题描述来看,听起来您想使用模板。例如,如果您编写一个函数

template <typename T>
void ExampleFunction(T* object)
{
     //do boxy stuff
}

您可以使用您感兴趣的所有类型调用它,只要统一的函数定义有意义。你可以说ExampleFunction(ptr) ptr有什么类型,当在ExampleFunction中替换T时是有意义的。

您可以按照您的建议(即使用 void *)指向所有对象,但我只会在用尽所有其他可能性后使用此选项,因为您将不得不 void * 强制转换它并丢失所有编译器大小/类型检查(实际上是重新解释强制转换)。

编辑:例如,当您从外部源接收"已知"数据时,您可能需要使用它,该外部源没有处理器间消息等类型信息。

最好的选择是将各种 box 类进行基类,并让其他类继承它们。这通常是 c++ 中的最佳方法,因为基类指针可以指向任何派生类。您仍然需要强制转换才能访问最终类型(例如 BoxedInt),但您可以使用更安全的动态转换;通常,您可以使用某种查找函数来执行此操作,或者使用工厂模式...

解决这个问题的标准方法是多态性。所以,正如其他人所指出的,在C++你会写

class Object { ... };
class Box : public Object { ... };
class BoxedInt : public Box { ... };
class BoxedString : public Box { ... };
...

在 C 中,你可以做完全相同的事情,即使它不会避免强制转换指针的必要性:

typedef struct Object { ... } Object;
typedef struct Box { Object super; ... } Box;
typedef struct BoxedInt { Box super; ... } BoxedInt;
typedef struct BoxedString { Box super; ... } BoxedString;
相关文章: