글 작성자: Sowhat_93

C++11 부터 Parameter Pack 을 사용할 수 있다.

아래의 간단한 예시를 보도록 하자.

//Argument가 1개 일때.
template<class T>
void ParamPackFunction(const T& Last)
{
    std::cout << typeid(Last).name() << " Type " << Last << std::endl;
}


//Argument가 2개이상.
//가장 앞의 Argument가 First에 들어오고, 나머지는 Next
template<class T, class ...NextParams>
void ParamPackFunction(const T& First, const NextParams&... Next)
{
    
    std::cout << typeid(First).name() << " Type " << First << std::endl;
    return ParamPackFunction(Next...);
}


int main()
{
    ParamPackFunction(1, 2.1, "Hello", "World!", 5);
    //1 2.1 "Hello" "World!" 5

    return 0;
}

 

va_list 는 어드레스로 구해온다.

따라서 타입까지는 알 수가 없다.

Parameter Pack 을 이용하면 타입이 알아서 Argument로 굴러 들어온다.

 

따라서 타입에 맞게 오버로딩된 함수를 호출할 수 있다는 이야기이다.

위의 예시에서도 그런 예시이다.

 

cout 의 << operator는 많은 오버로딩 을 가지고 있고,

출력할때에 별 생각 없이 넣어도 알아서 잘 출력해준다.

 

많은 상황에서 유용하게 사용될 수 있을 듯 하다.

나의 경우에는 ODBC 쿼리 사용시 bind param , bind col 에 이용했다.

 

		//Query.RegisterParamForQuery(TINYINTPARAM1)
        //Query.RegisterParamForQuery(TINYINTPARAM2)
        //Query.RegisterParamForQuery(NVARCHARPARAM1)
        
        Query.BindParamsForQuery(TINYINTPARAM1, TINYINTPARAM2, NVARCHARPARAM1);

        SQLRETURN RET = Query.ExcuteQuery(L"EXEC sp_ParamPackExample ?,?,?", Error);

        //Query.RegisterResColBuffer(BIGINT);
        //Query.RegisterResColBuffer(NVARCHAR1);
        //Query.RegisterResColBuffer(NVARCHAR2);
        //Query.RegisterResColBuffer(NVARCHAR3);

        //Parameter Pack을 사용해 코드가 조금 더 깔끔해 졌다.
        //재귀적으로 타입에 맞게 오버로딩된 RegisterParamForQuery 함수를 호출한다.
        Query.BindResCols(BIGINT, NVARCHAR1 , NVARCHAR2, NVARCHAR3);