Развернуть шаблон Variadic в макросе Vardiadic (как извлечь имена аргументов из целевой функции)

Я борюсь со сложной, но все же простой проблемой.
Допустим, у меня есть целевая функция следующим образом

void target_fnc(int arg1, double arg2)
{ /* do something here */ }

и что я хотел бы «извлечь», так это имена переменных (то есть «arg1», «arg2»).
Получить эту информацию для переменной с помощью некоторого предварительного процесса, например, тривиально

#define PRINTER(name) printer(#name)

void printer(const std::string& name) {cout << name << endl;}

и я также могу использовать переменные макросы в случае нескольких переменных

#define PRINTER2(names...) printer(#names)
printer(arg1,arg2)

но я не имею ни малейшего понятия о том, как «извлечь» из целевой функции .. например, используя методики шаблонов переменных, как следует

template <typename ...A>
void extract(void (*)(A...))
{ printer(A...); }

Это не сработает: я получу ‘A …’, а не распакованные переменные, конечно …
Какие-нибудь советы?

Спасибо!
Примечание: я использую C ++ 11, gcc 4.8.1

1

Решение

CPP — это только система копирования и вставки текста. Это не предназначено, чтобы сделать такую ​​магию. На самом деле, это только делает глупо «Когда вы видите Икс , положил Yоперации.

В вашем случае, если вы попытаетесь перебрать пакет с переменными значениями:

inline void print(const std::string& name) { std::cout << name << std::endl; }

#define PRINT(name) print(#name)

//Base case:
void extract() {}

//Recursive case:
template<typename HEAD , typename... TAIL>
void extract(const HEAD& head , const TAIL& tail...)
{
PRINT(head);

extract(tail...);
}

Вы получаете только:

голова
голова
голова
голова

Ответ: Избегайте использования CPP для глупых вещей, используйте его только для #ifdef #endif защита заголовков и портативная компиляция.

Обратите внимание, что GET_GREATHER(x,y) ((x) > (y) ? (x) : (y)) как макросы не включены. C ++ имеет с самого начала своей истории мощный инструмент для избежания макросов: встроенные функции

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]