Я борюсь со сложной, но все же простой проблемой.
Допустим, у меня есть целевая функция следующим образом
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
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 ++ имеет с самого начала своей истории мощный инструмент для избежания макросов: встроенные функции
Других решений пока нет …