2013-08-09 2 views
0

Я пытаюсь написать вариационную функцию, которая принимает неизвестное количество аргументов и создает массив типа ввода (его функция шаблона, поэтому, если входные аргументы являются float, он возвращает float ptr и аналогично другим типам данных)Variadic Function Universal Sentinel Value

Я думал, что могу использовать либо NAN, либо INFINITY в качестве значения дозорного устройства, потому что один из них теоретически никогда не будет использоваться в массиве (по крайней мере, для моих целей).

Более или менее функция выглядит следующим образом

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 как дантинал. Я также хотел бы сделать это предпочтительно без макроса.

т.е. int * a = arrayIt<int>(1,2,3,4,5,6,NAN);

ответ

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); 
+0

Я не знал, что это возможно. Я застрял в последнем выпуске C++ и не нашел времени, чтобы узнать новые вещи. Я попробую, когда у меня появится шанс! –

+0

Это было именно то, что мне нужно! –