可变函数通用哨兵值

时间:2013-08-09 03:26:25

标签: c++ variadic-functions

我正在尝试编写一个variadic函数,它接受一个未知数量的参数并创建一个输入类型的数组(它是一个模板函数,所以如果输入参数是浮点数,它会返回一个浮点数ptr,同样对其他数据类型)

我原以为我可以使用NANINFINITY作为哨兵值,因为其中一个理论上永远不会在数组中使用(至少就我的目的而言)。

或多或少的功能看起来像这个

template<typename T>
T* arrayIt(T first, ...)
{
    va_list ap;
    va_start(ap, first);

    T n = first, *array = (T*)malloc(sizeof(T));
    int sz = 0;
    while(!(isnan(n)) /* or infinite(n) */){
        sz++; // inc array size
        array = realloc(array, sizeof(T)*(sz+1)); // realloc

        array[sz] = n;
        n = va_arg(ap, T); // update temp 
    }

    array[0] = sz; // store size of array

    return (array + 1); //doing this places the first element at array[0]
    // the size of the array is stored at array[-1] 
}

除了整数之外,该功能按计划运行。 我想知道如何使用NAN这样的方式使用函数作为一个sentinal。 我也想在没有宏的情况下这样做。

即。 int * a = arrayIt<int>(1,2,3,4,5,6,NAN);

1 个答案:

答案 0 :(得分:3)

可能无法回答您提出的确切问题,但在C ++ 11中,您可以这样做:

template <typename T, typename... Vals>
std::array<T, sizeof...(Vals)> arrayIt(Vals... vals) {
    return std::array<T, sizeof...(Vals)>{static_cast<T>(vals)... };
}

在没有哨兵的情况下使用,例如:

auto a = arrayIt<int>(1, 2, 3, 4, 5, 6);