我想知道是否有宏或标准方式(用于调试目的)自动打印函数f的参数值,就像__FUNCTION__
打印/显示函数签名一样?例如,
void foo(int x, string y) {
cout << __FUNCTIION_ARGS__ << endl;
}
应显示x
和y
的值。
如果标准方式没有这样的魔法,是否可以编写宏/模板来执行此操作?
- 更新 -
Per @jxh的评论,如果使用宏/模板无法在相关函数内打印,是否可以在调用者端自动执行,如下所示:
call(foo,x,y);
打印每个参数值,并且与foo(x,y)
的行为相同,就像在其他方面直接调用它一样?如果值不可打印(例如指针,函数),则包装器call
只能打印不透明值,例如<ptr>
或<noprint>
。
由于
P.S。我正在使用gcc,(以及将来也会使用)。
答案 0 :(得分:2)
我接受它:
#include <iostream>
// Dummy parameter-pack expander
template <class T>
void expand(std::initializer_list<T>) {}
// Fun
template <class Fun, class... Args>
typename std::result_of<Fun&&(Args&&...)>::type
call(Fun&& f, Args&&... args) {
// Print all parameters
std::cout << "Params : ";
expand({(std::cout << args << ' ', 0)...});
std::cout << '\n';
// Forward the call
return std::forward<Fun>(f)(std::forward<Args>(args)...);
}
// Random test function
int myFunc(std::string const &s, double d, int i) {
std::cout << s << ' ' << d << ' ' << i << '\n';
return 57;
}
int main()
{
// Painless call
std::cout << call(myFunc, "hello", 3.14, 42) << '\n';
return 0;
}
输出:
Params : hello 3.14 42
hello 3.14 42
57
Variadic模板很有趣!
答案 1 :(得分:0)
没有用于打印参数的宏,但您可以使用__PRETTY_FUNCTION__
宏打印函数原型