使用变量参数列表与向量的原因(c ++)

时间:2016-06-17 17:39:39

标签: c++ vector stl variadic-functions

我正在尝试理解变量参数列表(varargs)。我之前使用指针和/或 std :: vector 作为参数,这些参数可以改变需要传递的对象的数量。

我希望Varargs(12)和向量(34)作为函数参数的一部分在C ++中都有自己的特殊用途在不同的事情上更好。但是,当 std :: vector 不是正确的选择时,我很难区分。请问这个可以解释一下吗?

这是可能首选varargs的场景吗?

union S //Using union from http://en.cppreference.com/w/cpp/language/union
{
    std::int32_t n;     // occupies 4 bytes
    std::uint16_t s[2]; // occupies 4 bytes
    std::uint8_t c;     // occupies 1 byte
};                      // the whole union occupies 4 bytes


int myFunction(std::vector<S> v)

3 个答案:

答案 0 :(得分:2)

std::printf就是一个很好的例子!

varargs用于std::printf的原因是可用性,特别是对程序员而言。

为什么必须创建一个向量来调用std::printf。这只是一个痛苦..而且,你必须在各自类型的组中传递参数,因为std::vector不能存储不同的类型:

//This would be horrible!
std::vector<std::string> text{ "Your age is" };
std::vector<std::string> text2{ "!" };
std::vector<int> age{ 26 };

//....
std::bad_print(text);
std::bad_print(age);
std::bad_print(text2);

很明显,varargs(或可变参数模板,同样的东西)会更好,并提高生产力,速度和内存:

//Much better
std::printf("%s %i %s", "Your age is ", age, "!");

//Even better
std::good_print("Your age is ", age, "!"); //Uses varargs or variadic templates

所以,这取决于。如果您知道在编译时要将多少个参数传递给函数,那么请使用varargs(或可变参数模板),因为没有理由创建单独的std::vector来存储这些值。

如果您不知道这些值,例如用户输入的值,则使用std::vector是合适的。

答案 1 :(得分:1)

varargs用于当调用者有一组固定的东西时,被调用的函数将采取任何操作。喜欢printf

printf(".....", foo, wiz, count);

我不需要这一次调用来获取不同数量的参数。如果args的类型不同,那么varargs也会更加清晰

答案 2 :(得分:1)

除非你有虚拟功能,或者你是预先C ++ 11,否则我建议不要使用varargs和模板参数包(http://en.cppreference.com/w/cpp/language/parameter_pack)。它们实现了相同的目标,但参数包是类型安全的,当varargs调用另一个varargs时,您不需要两组函数。此外,如果你有提升,变体而不是工会。 另一方面,如果从varargs函数调用虚函数(并传递va_list),实现可能会解析编译单元甚至不知道的类型。因此,您无法始终指定有限联合。