打印任意C++表达式的类型

Der*_*urn 6 c++

我有兴趣编写一个用于教学目的的工具,用于评估C++表达式并打印其类型.从本质上讲,我的想法是我的学生可以输入任何表达式,程序会回显表达式的类型.是否有现有工具已经这样做了?如果没有,通过与现有编译器集成并调用其调试器或API,是否有一种非常简单的方法可以实现?例如,有人告诉我,Clang有一个相当完整的编译器API,或许有一些方法可以将字符串与相应的include指令一起传递给Clang并让它吐出一个类型?

我意识到如果今天没有什么可以接近的话,这可能是一个巨大的项目.我只是觉得它具有重要的教育价值,所以看起来值得检查.

MSa*_*ers 9

我想出了一个受Ben Voigt评论启发的答案.只是制作一个错误,让编译器告诉你导致它的类型:

template <typename T> void foo(T); // No definition

int main() {
  foo(1 + 3.0);
}
Run Code Online (Sandbox Code Playgroud)

结果:

In function `main':
prog.cpp:(.text+0x13): undefined reference to `void foo<double>(double)'
Run Code Online (Sandbox Code Playgroud)

此外,由于您只执行编译器,因此您非常安全.真的,不需要沙箱.如果你得到的不是"未定义的引用void foo<T>(T)",那么它不是表达式.

[编辑]你会如何把它放入工具?简单,用宏

// TestHarness.cpp
// Slight variation to make it a compile error
template <typename T> void foo(T) { typename T::bar t = T::bar ; }

int main() {
  foo(EXPR);
}
Run Code Online (Sandbox Code Playgroud)

现在编译$(CC) /D=(EXPR) TestHarness.cpp.每次都可以避免重建输入文件.