我正在尝试理解变量参数列表(varargs)。我之前使用指针和/或 std :: vector 作为参数,这些参数可以改变需要传递的对象的数量。
我希望Varargs(1,2)和向量(3,4)作为函数参数的一部分在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)
答案 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),实现可能会解析编译单元甚至不知道的类型。因此,您无法始终指定有限联合。