如何在变量参数方法中获取所有参数?

时间:2011-09-14 09:50:55

标签: c++ c

我有一个从ruby脚本调用的变量参数函数,如下所示:

static myMethod(VALUE exc, const char *fmt, ...)
{
  // Implementation of myMethod which requires all the arguments 
  // how to access the all arguments.
}

任何人都可以告诉我如何访问所有参数。 提前谢谢。

2 个答案:

答案 0 :(得分:5)

“访问所有参数”是什么意思?您可以使用来自va_...组(va_startva_arg等)的宏来逐个访问可变参数。通常这样做。

答案 1 :(得分:3)

在C ++ 11中,引入了可变参数模板,它为变量函数提供了类型安全的替代方案。

典型示例是传统printf的变体,来自Wikipedia

void printf(const char *s)
{
    while (*s) {
        if (*s == '%' && *(++s) != '%')
            throw std::runtime_error("invalid format string: missing arguments");
        std::cout << *s++;
    }
}

template<typename T, typename... Args>
void printf(const char *s, T value, Args... args)
{
    while (*s) {
        if (*s == '%' && *(++s) != '%') {
            std::cout << value;
            ++s;
            printf(s, args...); // call even when *s == 0 to detect extra arguments
            return;
        }
        std::cout << *s++;
    }
    throw std::logic_error("extra arguments provided to printf");
}

请注意上面示例中的T如何是真实类型(虽然模板定义中未知)。

主要优点是您可以安全地将任何类型/类传递给可变参数模板,而对于C风格的可变参数,您仅限于内置类型(包括指针)。使用可变参数模板仍然需要一些学习。