gpt4 book ai didi

c++ - 如何自动打印输入的c++函数参数值

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:59 29 4
gpt4 key购买 nike

我想知道是否有宏或标准方法(用于调试目的)自动打印函数 f 的参数值,就像 __FUNCTION__打印/显示功能签名?例如,

void foo(int x, string y) {
cout << __FUNCTIION_ARGS__ << endl;
}

应该显示 x 的值, 和 y .

如果标准方式没有这样的魔力,是否可以编写宏/模板来执行此操作?

--更新--

根据@jxh 的评论,如果使用宏/模板无法在相关函数内打印,是否可以在调用方自动执行此操作,例如:

call(foo,x,y);

它打印每个参数值,并且与 foo(x,y) 的行为相同好像它在所有其他方面都被直接调用了?如果一个值不可打印(例如指针、函数),包装器 call可以只打印一个不透明的值,例如 <ptr><noprint> .

谢谢

附言我正在使用 gcc,(将来还会使用 clang)。

最佳答案

我的看法:

#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

可变参数模板很有趣!

关于c++ - 如何自动打印输入的c++函数参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24949700/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com