Просто для небольшого фона это не тривиальное упражнение! Я работаю с Boost.Python, и, чтобы избежать множества уродливых шаблонов кода, я использую макросы для обертывания функций в классах оболочки Python, чтобы при необходимости вызвать переопределение Python для этого метода, если он существует.Использование макросов для создания списка аргументов от __VA_ARGS__
Я вареная загадку вниз к нему простейшая форма, here:
#include <iostream>
using namespace std;
void foo() { cout << "foo" << endl; }
void bar(char, short, int) { cout <<"bar" << endl; }
#define DEFINE_FUNCTION_WRAPPER(return_type, name, ...)\
return_type name##_wrapper(/* macro expansion */)\
{\
return name(/* macro expansion */);\
}\
DEFINE_FUNCTION_WRAPPER(void, foo) // works!
//DEFINE_FUNCTION_WRAPPER(void, foo, char, short, int) // knowledge insufficient
int main() {
foo_wrapper();
//bar_wrapper(0, 1, 2);
}
Хотя это, очевидно, работает foo
, моя цель состоит в том, чтобы иметь DEFINE_FUNCTION_WRAPPER(void, foo, char, short, int)
генерировать функцию оболочку, которая выглядит следующим образом:
void bar_wrapper(char _1, short _2, int _3)
{
return bar(_1, _2, _3);
}
Я ищу, чтобы быть направленным в правильном направлении, как лучше всего справиться с этим, так как я действительно хотел бы освоить этот вид макромагии.
Любая помощь приветствуется!
ПРИМЕЧАНИЕ: Я собираю данные на MSVC C++ 11.
Если 'bar (char, short, int)' существует, какая точка 'bar_wrapper' является точным псевдонимом для него? – twentylemon
Прочитайте начало сообщения. Это тривиальный пример для нетривиальной реализации. –
Возможно, требуется менее простой пример. Я не вижу необходимости использовать макросы. – twentylemon