2015-06-01 3 views
1

Можно ли переслать список параметров для создания объявления функции? Следующая псевдо-макро Дано:Пересылка параметров в функции препроцессора макрос

#define FUNCTION_DECLARATION(function_name, ...) \ 
void function_name(__VA_ARGS__) \ 
{ \ 
    other_function_but_gets_the_same_params(__VA_ARGS__); \ 
} 

Я хочу создать объявление функции, используя что-то похожее на следующий синтаксис:

FUNCTION_DECLARATION(MyFunction, char, char, int) 

ответ

1

Ну, это смешно, что вы спрашиваете это, потому что я работал на том, что на прошлой неделе.

Это бит, который вас интересует. Использует Boost.Preprocessor.

#define STRIP_PARENS(...) __VA_ARGS__ 

#define PARAM_PROTO(i, elem)           \ 
    STRIP_PARENS elem _ ## i 

#define PARAM_FWD(i, elem)            \ 
    std::forward<STRIP_PARENS elem>(_ ## i) 

#define MAKE_PARAM(r, macro, i, elem)         \ 
    STRIP_PARENS BOOST_PP_IF(           \ 
     BOOST_PP_IS_EMPTY(STRIP_PARENS elem),       \ 
     (),                \ 
     (BOOST_PP_COMMA_IF(i) macro(i, elem))       \ 
    ) 

#define MAKE_PARAM_LIST(params, macro)         \ 
    BOOST_PP_SEQ_FOR_EACH_I(MAKE_PARAM, macro, params) 

#define FUNCTION_DECLARATION(function_name, params)      \ 
    void function_name(MAKE_PARAM_LIST(params, PARAM_PROTO)) {   \ 
     other_function(MAKE_PARAM_LIST(params, PARAM_FWD));    \ 
    } 

Использование следующим образом:

FUNCTION_DECLARATION(myFunction, ((int))((float))((std::string&))) 

// Expands to : 
void myFunction(int _0, float _1, std::string& _2) { 
    other_function(
     std::forward<int>(_0), 
     std::forward<float>(_1), 
     std::forward<std::string&>(_2) 
    ); 
} 

FYI, список странных перспективных параметров, чтобы справиться с типами, содержащими запятые (например std::array<int, 4>). Двусторонняя скобка состоит в том, что BOOST_PP_SEQ_SIZE также совершает поездки по запятым, на один уровень глубже ...

Смежные вопросы