C ++是否支持可变数量的函数参数?

时间:2011-09-20 15:04:52

标签: c++

printf

但是我记得C ++确实使用函数名和参数类型进行了命名,

这可以推断出C ++不支持可变长度参数......

我只是想确定,是这样吗?

更新

讨论应排除extern "C"

所包含的内容

2 个答案:

答案 0 :(得分:6)

是。 C ++从C继承了这个。你可以写:

void f(...);

此函数可以使用任何类型的任意数量的参数。但那不是很C ++风格。程序员通常会避免这种编码。

然而,有一个例外:在模板编程中,SFINAE充分利用了这一点。例如,请参阅此内容(摘自here):

template <typename T>
struct has_typedef_type {
    // Variables "yes" and "no" are guaranteed to have different sizes,
    // specifically sizeof(yes) == 1 and sizeof(no) == 2.
    typedef char yes[1];
    typedef char no[2];

    template <typename C>
    static yes& test(typename C::type*);

    template <typename>
    static no& test(...);

    // If the "sizeof" the result of calling test<T>(0) 
    // would be equal to the sizeof(yes), the first overload worked 
    // and T has a nested type named type.
    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

这使用test(...)这是一个可变函数。

答案 1 :(得分:4)

是的,C ++支持C语言的省略号,但我强烈反对使用它们,因为它们绝不是类型安全的。

如果您可以访问具有可变参数模板支持的C ++ 11编译器,那么您应该使用它。如果你没有,请看看boost :: format如何解决这些问题。