如何在不使用可变参数的情况下遍历函数的参数

时间:2019-09-30 13:49:54

标签: c++ gcc

不使用可变参数函数,是否可以遍历函数的参数?

这可以帮助我解决问题gcc instrumentation - is it possible to automatically output the arguments of a function?

1 个答案:

答案 0 :(得分:0)

如果只想输出参数,可变参数模板函数就可以解决问题–为可变参数函数提供类型安全性缺乏的功能...

void print() { }

template <typename T, typename ... TT>
void print(T&& t, TT&& ... tt)
{
    std::cout << std::forward<T>(t) << ' ';
    print(tt...);
}

template <typename F, typename ... TT>
void execute(F f, TT&& ... tt)
{
    std::cout << "calling function with arguments: ";
    print(std::forward<TT>(tt)...);
    std::cout << std::endl;

    f(std::forward<TT>(tt)...);
}

如果您允许使用一些预编译器魔术,我们甚至可以添加函数名称:

template <typename F, typename ... TT>
void execute_(F f, char const* name, TT&& ... tt)
{
    std::cout << "calling function " << name << " with arguments: ";
    // ...
}

#define execute(FUNCTION, ...) execute_(FUNCTION, #FUNCTION, ## __VA_ARGS__)
// be aware of GCC extension:                                ^^
// (catching empty arguments list)

用法示例here ...

它有一些变通办法(当然,您需要另一个函数调用,并且lambda可能看起来很丑),但是使用纯C ++手段却没有丑陋的技巧就可以得到结果(也许除了宏之外)。