【发布时间】:2016-08-02 18:13:01
【问题描述】:
我将使用 C 作为示例语言来说明我的意思。
struct parent
{
int x;
char y;
};
struct child
{
char y;
int x;
};
int foo(void * s, type obj_type)
{
// the casting is done using a "type" variable
obj_type obj = (obj_type) s;
return obj->x;
}
int main(int argc, char** argv)
{
type obj_type = struct parent *;
struct parent p;
p.x = 0;
//returns 0
foo(&p, obj_type);
obj_type = struct child *;
struct child c;
c.x = 5;
// returns 5
foo(&c, obj_type);
return 0;
}
如您所见,两个结构的 x 被放置在内存中的不同位置,因此我不能只在内存中拥有静态偏移量。无论如何,这在 C 中是否可能(一些我想不到的预处理器魔法)?我假设没有,但是有没有可以将类型本身用作变量的语言?我很想探索以类型为中心的编程的含义
编辑:正如 itsme86 所指出的,C# 具有 Type 类的这种能力。 C++ 概念和 Haskell 类型类也很有趣。
【问题讨论】:
-
我不认为我遵循您的要求。你想让
return obj->x;返回int吗? -
是的。但是,根据类型运算符,obj->x 可能位于 obj 的地址,也可能是 1 个字节的偏移量(给定结构设置)。我想要的是一个可以用来识别类型而不是值的变量
-
您要查找的功能是type introspection。它在一些面向对象的语言中可用,但在 C 中不可用(尽管您可以通过添加
type成员作为所有结构的第一个成员来破解它)。 -
@user3386109 这部分是我想要的,但是变量可以用任何语言保存这些值吗?例如,C++ 支持 dynamic_cast,但它看起来不允许我创建一个值为类型的新变量
-
C# 绝对有这个能力。有一个
Type类,它包含关于它所指的任何类型的各种信息。还可以根据该信息在运行时创建该类型的新对象。