Здравствуйте, Lepsik, Вы писали:
L>какими средствами в бусте можно разобрать сигнатуру функции и склеить ее тело по шаблону типа :
Боюсь, что только средствами языка (препроцессор + Си/С++) это сделать невозможно.
Но можно сделать собственный препроцессор, который будет рожать сишный код
// ищет объявления вида
DECLARE_PROTOTYPE( int __stdcall foo (int x, int y, int z) )
// и превращает их#define RETTYPE_foo int
#define CONVENTION_foo __stdcall
#define ARGUMENTS_foo (int x, int y, int z)
// после чего#define PP_CAT(x,y) PP_CAT_(x,y)
#define PP_CAT_(x,y) x##y
#define RETTYPE(f) PP_CAT(RETTYPE_,f)
#define CONVENTION(f) PP_CAT(CONVENTION_,f)
#define ARGUMENTS(f) PP_CAT(ARGUMENTS_,f)
#define USE_PROTOTYPE(f,g) RETTYPE(f) CONVENTION(f) g ARGUMENTS()
#define PROTOTYPE(f) USE_PROTOTYPE(f,f)
Можно вынести объявления прототипов в отдельный файл, на основе которого генерировать обычный .h — дальше всё будет просто.
Единственная заморочка — разбирать сигнатуру функции, с учётом сложностей объявления типа в Си.
Скажем, вот уже такое int(*foo(int x))[10] — функция, возвращающая указатель на массив из 10 интов.
Да ещё с учётом макроподстановок...
Видимо, придётся как-то себя ограничить — использовать typedef'ы и приводить объявление к красивому предсказуемому виду.
К>Единственная заморочка — разбирать сигнатуру функции, с учётом сложностей объявления типа в Си. К>Скажем, вот уже такое int(*foo(int x))[10] — функция, возвращающая указатель на массив из 10 интов. К>Да ещё с учётом макроподстановок... К>Видимо, придётся как-то себя ограничить — использовать typedef'ы и приводить объявление к красивому предсказуемому виду.
то есть в первой копии вырезать convesion тип, а всю строку вставить как есть.
Это я делаю mock библиотеку для winapi библиотек и не хотелось бы усложнять тяжелыми конструкциями, остановившись на чем-то таком в описании:
А зачем это на boost-е делать и вообще C++? imho проще на скрипте парсер написать. Я на python-е делал, например. Универсальный парсер, который понимает любой валидный синтаксис C городить нет смысла, заточить только под особенности тех исходников, которые надо разбирать. Чтобы с макроподстановками не связываться можно предварительно прогонять исходник через C-ый препроцессор, а потом скармливать его парсеру.
Честно говоря не до конца понял задачу, однако ситуация по разбору типов WINAPI функций чем-то знакомая.
Можно использовать BOOST_TYPEOF из Boost.Typeof для извлечения типа функции
И потом применительно к типу TRegOpenKeyExA использовать библиотеку Boost.FunctionTypes для декомпозиции параметров и композиции типа функций которая тебе будет нужна.
Далее всё это завернуть в макрос И будет в итоге что-то типа