实例化数组的变量参数函数

时间:2015-02-03 23:14:07

标签: c++ templates

我有以下代码:

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;同样,但这也不起作用。

2 个答案:

答案 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;
}