2017-04-19 26 views
1

이 질문은 예제를 통해 질문하는 것이 가장 좋습니다. 비교 함수를 사용하여 std::priority_queue을 선언한다고 가정 해 보겠습니다. 할 수있는 일 :기본 템플릿 인수 사용

auto cmp_fn = [](const std::string& left, const std::string& right) { 
    return right < left; 
}; 

std::priority_queue<std::string, std::vector<std::string>, decltype(cmp_fn)> queue(cmp_fn); 

기본값이 사용되도록 중간 템플릿 매개 변수를 지정하지 않으려면 어떻게해야합니까?

auto cmp_fn = [](const std::string& left, const std::string& right) { 
    return right < left; 
}; 

std::priority_queue<std::string, /* use default */, decltype(cmp_fn)> queue(cmp_fn); 

주와 같은 뭔가 : 이것은 내가 뭘 더 복잡한 무언가의 간단한 예입니다. 양식의 제안으로 "그냥 std::greater을 사용하십시오"라고 대답하지 마십시오. 내 질문은 템플릿 인수에 관한 것입니다.

+1

하지,하지만 확실히 않을 것, 가능한 것 같다 템플릿 별명? – WhozCraig

답변

2

이를 사용할 수 있습니다

template <class T, class Comparator> 
using dcpq = /*default container priority queue*/ 
    std::priority_queue<T, typename std::priority_queue<T>::container_type, Comparator>; 

int main() { 
    auto cmp_fn = [](const std::string &left, const std::string &right) 
        { return right < left; }; 
    dcpq<std::string, decltype(cmp_fn)> queue(cmp_fn); 
} 

처럼 사용할 수에 직접 쉬울 수 있습니다

std::priority_queue<std::string, typename std::priority_queue<T>::container, 
    decltype(cmp_fn)> queue(cmp_fn); 

을 쓰고 있지만.

+0

미안하지만 ...'decltype (get_queue_storage (std :: priority_queue {}))'대신'std :: priority_queue :: container_type'을 사용하는 것은 어떨까요? 나는 당신이'get_queue_storage()'없이 할 수 있다고 가정한다. – max66

+0

@ max66 그래, 그게 더 똑똑 할거야. – nwp

1

std::priority_queue의 두 번째 템플릿 매개 변수에 대한 특정 솔루션에 관심이있는 경우 typename std::priority_queue<T>::container_type을 어떤 방식 으로든 사용할 수 있다고 가정합니다 (예를 들어, nwp; +1의 솔루션 참조).

보다 일반적인 솔루션에 관심이 만약 (비에만 두 번째 기본 템플릿 유형 만 std::priority_queue 비), 난 당신이 먼저 목록에서 n 번째 유형을 estract하는 유형 특성 type_n을 개발할 수 있다고 생각

다음
template <std::size_t N, typename T0, typename ... Ts> 
struct type_n 
{ using type = typename type_n<N-1U, Ts...>::type; }; 

template <typename T0, typename ... Ts> 
struct type_n<0U, T0, Ts...> 
{ using type = T0; }; 

유형의 특성 type_cnt_n (즉, 사용 type_n)

template <std::size_t, typename> 
struct type_cnt_n; 

template <std::size_t N, template <typename ...> class Cnt, typename ... Ts> 
struct type_cnt_n<N, Cnt<Ts...>> 
{ using type = typename type_n<N, Ts...>::type; }; 

과 마지막 (NWP의 대답은 다음과 같은) 템플릿 템플릿 매개 변수의 n 번째 형식 인수를 추출 이 솔루션의 make_priority_queue() 기능

template <typename T, typename Cmp> 
auto make_priority_queue (Cmp const & cmp) 
{ return std::priority_queue<T, 
     typename type_cnt_n<1U, std::priority_queue<T>>::type, Cmp> { cmp }; } 

문제는 유일한 유형 전용 템플릿 매개 변수 템플릿 템플릿 유형 작동 (그래서 std::map으로, std::vector으로, std::priority_queue로 작동하지만 std::array 작동하지 않습니다) 즉.

다음은 전체 작업 ... 음, 전체 컴파일 ... 예를 직접

#include <queue> 
#include <iostream> 

template <std::size_t N, typename T0, typename ... Ts> 
struct type_n 
{ using type = typename type_n<N-1U, Ts...>::type; }; 

template <typename T0, typename ... Ts> 
struct type_n<0U, T0, Ts...> 
{ using type = T0; }; 

template <std::size_t, typename> 
struct type_cnt_n; 

template <std::size_t N, template <typename ...> class Cnt, typename ... Ts> 
struct type_cnt_n<N, Cnt<Ts...>> 
{ using type = typename type_n<N, Ts...>::type; }; 


template <typename T, typename Cmp> 
auto make_priority_queue (Cmp const & cmp) 
{ return std::priority_queue<T, 
     typename type_cnt_n<1U, std::priority_queue<T>>::type, Cmp> { cmp }; } 

int main() 
{ 
    auto cmpFn = [](std::string const & l, std::string const &r) 
    { return r < l; }; 

    auto pq = make_priority_queue<std::string>(cmpFn); 
}