我有一个从ruby脚本调用的变量参数函数,如下所示:
static myMethod(VALUE exc, const char *fmt, ...)
{
// Implementation of myMethod which requires all the arguments
// how to access the all arguments.
}
任何人都可以告诉我如何访问所有参数。 提前谢谢。
答案 0 :(得分:5)
“访问所有参数”是什么意思?您可以使用来自va_...
组(va_start
,va_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风格的可变参数,您仅限于内置类型(包括指针)。使用可变参数模板仍然需要一些学习。