Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;诀窍:为多个不同的类型定义一个统一的类型?_C++_C_Types_Compilation_Clang - Fatal编程技术网

C++ C/C++;诀窍:为多个不同的类型定义一个统一的类型?

C++ C/C++;诀窍:为多个不同的类型定义一个统一的类型?,c++,c,types,compilation,clang,C++,C,Types,Compilation,Clang,我正在做一些编译器的事情,我有多种不同的类型: Box* BoxedInt* BoxedString* ... 它们基本上都是指向不同对象的指针,我想创建一个统一的类型,称为ObjectPointer,它可以表示所有这些指针类型。我倾向于使用void*,因为我不想在任何地方都使用铸造。我能做什么?我可以做一些类似于: typedef Box* ObjectPointer typedef BoxedInt* ObjectPointer .... 还是有别的办法?对于这些指针,我只需要

我正在做一些编译器的事情,我有多种不同的类型:

Box*
BoxedInt*
BoxedString*
...
它们基本上都是指向不同对象的指针,我想创建一个统一的类型,称为
ObjectPointer
,它可以表示所有这些指针类型。我倾向于使用
void*
,因为我不想在任何地方都使用铸造。我能做什么?我可以做一些类似于:

typedef Box*      ObjectPointer
typedef BoxedInt* ObjectPointer
....
还是有别的办法?对于这些指针,我只需要一个类似于
代数数据类型的东西。顺便说一下,我正在使用
clang


我打算像使用普通类型一样使用新类型
ObjectPointer
。它不应该是类、结构或联合。假设在更改后我有一个函数
Box*add(BoxedInt*lhs,BoxedInt-rhs)
,它应该是
ObjectPointer-add(ObjectPointer-lhs,ObjectPointer-rhs)
C
中,您可以使用一个
联合
类型,它包含上述所有元素的指针:

union UnifiedType {
  Box* boxPtr;
  BoxedInt* boxedIntPrt;
  BoxedString* boxedStringPtr;
};
寻找更多

class BoxedBase { /*....*/ }

class Box : public BoxedBase { /*....*/ }
class BoxedInt : public BoxedBase { /*....*/ }
class BoxedString : public BoxedBase { /*....*/ }
不过,在
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
}
模板
void示例函数(T*对象)
{
//做盒状的东西
}

只要一个统一的函数定义有意义,就可以用所有感兴趣的类型调用它。您可以说
ExampleFunction(ptr)
其中
ptr
具有任何类型,当在
ExampleFunction
中替换
T
时,这些类型都是有意义的。您可以按照您的建议执行(即使用一个空*)来指向所有对象,但我只会在您用尽所有其他可能性后使用此选项,因为您将不得不作废*强制转换它并丢失所有编译器大小/类型检查(实际上是重新解释强制转换)

编辑:例如,当您从没有处理器间消息等类型信息的外部源接收“已知”数据时,可能需要使用此选项


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

解决此问题的标准方法是多态性。因此,正如其他人所指出的,在C++中,你将编写< /P>
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;

是否不允许将这些类的定义更改为从
ObjectPointer
继承?取决于您打算如何使用此组合类型。请添加更多详细信息。那么,您使用哪种语言?也请删除标题中的标签,它们不属于那里。<代码>公共类< /COD>和<代码>公共抽象类< /C> >不是C++。