确定表达式的类型

aib*_*aib 7 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"
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?(即学习表达的类型)

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

aib*_*aib 17

有时我只是这样做:

int ***a = expression;
Run Code Online (Sandbox Code Playgroud)

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

  • 我创建了一个类'FailAssign',然后尝试将表达式分配给该类的实例.这样就不会有自动转换(甚至有些错误). (3认同)
  • 一些较旧的C编译器实际上会允许这样做.:-( (2认同)
  • 嗯,好主意.虽然我的方式让你宣布一个三指针!你多久一次这样做?:) (2认同)

Joh*_*itb 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
Run Code Online (Sandbox Code Playgroud)

如果没有像 boost.typeof 这样的辅助库,自动类型推断目前是不可能的,它将使用像__typeof__GCC 这样的编译器扩展。接下来,C++ 将获取auto(具有与 current 不同的语义auto)并且能够做到这一点,同时decltype获取表达式的类型。

如果您可以忍受脱离本地上下文,您始终可以创建一个如下所示的函数模板:

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

  • Geordi 链接已失效 - 这是 github 上的当前位置:https://github.com/Eelis/geordi (2认同)