В частности, у нас есть исходный файл С++:
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.
Легко найти ClassTemplateDecl N
и F
, а QualType и FunctionDecl указателей функций &fopen
, &fclose
и т.д.. Но проблема в том, как заменить эти аргументы на N, F и F:: A без изменения исходного кода.
Возникает вопрос:
- Как оценить
F<decltype(&fprintf), &fprintf>::A<N<4>>
и узнать, что этоint*
? - Как оценить
F<decltype(&fopen), &fopen>::A<N<7>>
и узнать, что этоdouble*
? - и т.д.