首页 > 解决方案 > 如何在没有可变参数函数的情况下循环函数的参数

问题描述

如果不使用可变参数函数,是否可以循环函数的参数?

这将帮助我解决我的问题gcc 仪器 - 是否可以自动输出函数的参数?

标签: c++gcc

解决方案


如果您只想输出参数,可变参数模板函数可以解决问题 - 提供可变参数函数所缺乏的类型安全......

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)

这里的用法示例...

它有点变通方法的味道(当然,您需要另一个函数调用并且 lambdas 可能看起来很难看),但是您可以通过纯 C++ 手段获得结果,并且没有丑陋的技巧(也许除了宏之外)。


推荐阅读