我有以下代码:
template<typename T>
void fillArray(T arrayToFill, int numElements, ...) {
va_list vl;
double val;
va_start(vl, numElements);
for (int i = 0; i < numElements; i++) {
val = va_arg(vl, double);
arrayToFill[i] = val;
}
}
我知道具有可变参数数量的函数是不好的做法,但它要与一些旧的代码一起使用,这些代码的更改非常耗时。如果我这样称呼它:
int myArray[10];
fillArray(myArray, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
它只是用零填充数组(或者是c ++ 11中的默认值?) 这里有什么东西不见了吗?它不应该通过引用传递数组吗?我尝试过usint T&amp;同样,但这也不起作用。
答案 0 :(得分:0)
这可能是个问题。可能是我弄错了,但这条线 val = va_arg(vl,double); 是不正确的。这假设争论将是双打的。但在你的例子中他们是整数。这可能是问题所在。
答案 1 :(得分:0)
首先,您应该通过引用传递数组(它应该是T&amp;)。第二,你应该实际传递双打,因为你的功能需要双打。 int的大小(4字节)比双精度(8字节)小两倍。
由于您使用va_xxx删除了所有类型检查,因此您应该关心自己传递的类型的正确性。
意思是,它应该是这样的:
double myArray[10];
fillArray(myArray, 10, 0.0l, 1.0l, 2.0l, 3.0l, 4.0l, 5.0l, 6.0l, 7.0l, 8.0l, 9.0l);
如果你不介意std :: vector而不是int []那么你可以使用variadic模板,它更优雅,更安全:
template<typename T, typename ...Args>
void fillArray(T& arrayToFill, Args... args) {
arrayToFill = { args... };
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> myArray;
fillArray(myArray, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
return 0;
}