首页 > 解决方案 > 如何在不传递参数数量且仅使用 3 个点的情况下使用可变参数函数?

问题描述

考虑下面的代码,是否可以在不获取参数数量的情况下定义可变参数函数?

void printFunction(...)
{
    int noOfArgs = "Any way to get number of arguments?";
    va_list args;
    va_start(args, noOfArgs);
    cout << va_arg(args, int) << endl;
    for (int i = 2; i <= noOfArgs; i++)
    {
        cout << va_arg(args, int) << endl;
    }
    va_end(args);
}


int main()
{

    printFunction(1, 2, 3, 4, 5);

    return 0;
}

标签: c++variadic

解决方案


在 C 中获取参数的数量是不可能的va_args。你能做的最好的事情是使用一个结束序列的魔法值和一个宏来对你的用户隐藏它:

#define printFunction(...) actualPrintFunction(__VA_ARGS__, 42)
void actualPrintFunction(int first, ...)
{
    va_list args;
    va_start(args, first);
    int arg;
    std::cout << first << endl;
    while((arg = va_arg(args, int)) != 42)
    {
        cout << arg << endl;
    }
    va_end(args);
}

如评论中所述,您也可以使用 C++ 折叠表达式。上面的优点是与 C 兼容,编译速度更快,而 C++ 方法为您提供类型安全


推荐阅读