【发布时间】:2012-11-06 11:29:04
【问题描述】:
具体来说,我们有一个这样的 C++ 源文件:
template <int n>
struct N {};
struct B {
template <typename M>
using A = typename std::conditional<std::is_same<M, N<4>>::value,
int*, void*>::type;
};
template <typename T, T value>
struct F : B {};
template <>
struct F<decltype(&fopen), &fopen> : B {
template <typename M>
using A = double*;
};
template <>
struct F<decltype(&fclose), &fclose> : B {
template <typename M>
using A = typename std::conditional<std::is_same<M, N<16>>::value,
void*, char**>::type;
};
// More specialization of 'F' follows.
很容易找到N和F的ClassTemplateDecls,以及函数指针&fopen、&fclose等的QualType和FunctionDecl。但问题是如何在不修改源代码的情况下将这些参数替换为 N、F 和 F::A。
问题是:
- 如何评估
F<decltype(&fprintf), &fprintf>::A<N<4>>并知道它是int*? - 如何评估
F<decltype(&fopen), &fopen>::A<N<7>>并知道它是double*? - 等等……
【问题讨论】:
-
我不完全确定我理解你想要做什么,但你为什么不能使用 typeid?
-
@AndreiTita:我们正在尝试使用 C++ 解析器 (clang) 对此进行评估。
标签: c++ clang abstract-syntax-tree