确定表达式的类型

时间:2009-05-06 13:41:01

标签: c++ c

有时我需要在用C或C ++编程时学习表达式的类型。有时会有一个好的IDE或现有的文档来帮助我,但有时候没有。我经常觉得这样的构造可能很有用:

void (*myFunc)(int);
printf("%s", nameoftype(myFunc)); //"void (*)(int)"
int i, unsigned int u;
printf("%s", nameoftype(i+u));    //"unsigned int"

对于C ++尤其如此;认为const对象的访问器 - 它们是返回const引用还是副本?想想动态演员表和模板化课程。

我该怎么做? (即学习表达的类型)

我使用GCC但据我所知,它没有这样的扩展名。所以我想我很好奇人们如何解决这个问题。 (欢迎编译时和运行时解决方案。)

5 个答案:

答案 0 :(得分:17)

有时我只是这样做:

int ***a = expression;

并查找“<表达式类型>无法分配给指针到^ 3 int”错误。这似乎是最便携的解决方法。

答案 1 :(得分:2)

C ++有一个typeid运算符;

typeid(expression).name()

将返回表达式类型的实现定义名称。唉,它通常不是人类可读的。

答案 2 :(得分:2)

你在找什么?自动类型推断或查找类型,以便您可以手动正确声明变量? (你自己的答案看起来像你想要第二个)。在这种情况下,请考虑使用Geordi

<litb> make type pointer to function taking pointer to array of 10 int returning void
<geordi> void (*)(int (*)[10])

<litb> geordi: { int a = -1; unsigned int b = 0; cout << ETYPE(a + b), ETYPE_DESC(a + b), (a + b); }
<geordi> rvalue unsigned int, rvalue unsigned integer, 4294967295

<litb> geordi: << TYPE_DESC(void (*)(int (*)[10]))
<geordi> pointer to a function taking a pointer to an array of 10 integers and returning nothing

如果没有诸如boost.typeof之类的辅助库,目前无法进行自动类型推断,它将为GCC使用__typeof__之类的编译器扩展。下一个C ++将获得auto(具有与当前auto不同的语义)并且能够与decltype一起执行此操作以获取表达式的类型。

如果您可以离开本地环境,您可以随时创建一个这样的功能模板:

template<typename T> void f(T t) { /* ... */ }
int main() { int a = -1; unsigned int b = 0; f(a + b); }

答案 3 :(得分:1)

尝试Boost.Typeof以确定它是否合适。

答案 4 :(得分:1)

gcc在编译时有typeof()。它的作用类似于sizeof()。

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html有更多信息。