Конечно. Расширить тело функции-члена call
немного проще, если у вас есть компилятор, который поддерживает переменные макросы. Хотя я использовал макрос stringize Boost.Preprocessor, написать свой собственный тривиально.
#define DEFINE_CLASS(name, parenthesized_call_body) \
class name : public Function { \
ref call (ref args) { \
DEFINE_CLASS_CALL_BODY parenthesized_call_body \
} \
int getType() { return TYPE; } \
const char* toString() { return BOOST_PP_STRINGIZE(name); } \
};
#define DEFINE_CLASS_CALL_BODY(...) __VA_ARGS__
Используется как:
DEFINE_CLASS(SomeClass, (return ref()))
Тело call
необходимо заключить в скобки, чтобы любые запятые, присутствующие в теле, не обрабатывались как разделители аргументов макроса. Кроме того, вы можете просто объявить функцию call
в определении класса, а затем определить эту функцию отдельно.