2013-08-09 3 views
0

알 수없는 인수를 취하여 입력 유형의 배열을 만드는 가변 인자 함수를 작성하려고합니다 (템플릿 함수이므로 입력 인수가 float 일 경우 float ptr을 반환하고Variadic 함수 범용 센티넬 값

NAN 또는 INFINITY 중 하나는 이론적으로는 적어도 내 용도로는 사용되지 않으므로 센티널 값으로 사용할 수 있다고 생각했습니다.

은 더 많거나 적은 기능의 int를 제외한 모든 것을 계획대로이 기능은 작동이

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

답변

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

이것은 정확히 내가 필요로했던 것입니다! –

관련 문제