C/C++技巧:为多个不同的类型定义一个统一的类型
C/C++ trick: define a unified type for multiple different types?
我正在研究一些编译器的东西,我有多种不同的类型:
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;
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 构造函数正在调用一个使用当前类类型的函数
- 引用一个已擦除类型(void*)的指针
- 在一个模板函数中,若输入的类型是enum类,我该如何使用std::underlying_type
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 在c++中为double类型的数组创建一个unique_ptr
- 当基类是依赖类型时,这是一个缺陷吗
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- C++将一个指针分配给另一个指针时执行的类型检查
- 模板函数如何处理可能共享一个交集的多个类型名称?
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 取消引用结束指针到数组类型的一个
- 为什么转换函数声明不需要至少一个定义类型说明符
- 如何包装一个函数以适应另一个函数的所需类型
- 使用C++生成泛型类型-一个具有共享实现的模板