有时我需要在用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"错误.这似乎是最便携的解决方法.
你要买什么?自动类型推断或查找类型以便您可以手动正确声明变量?(你自己的答案看起来像是你想要第二个)。在这种情况下,请考虑使用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)
| 归档时间: |
|
| 查看次数: |
3513 次 |
| 最近记录: |