2016-10-23 11 views
8

튜플 유형이 있고 다른 템플릿을 인스턴스화하기 위해 템플릿 매개 변수 팩을 추출한다고 가정 해보십시오. 그것이 유형 템플릿이라면 다음과 같은 유틸리티를 사용할 수 있습니다 :가변 템플릿 템플릿?

template < typename Tuple, template <typename...> typename What > 
struct PutTupleInT; 

template < typename... Types, template <typename...> typename What > 
struct PutTupleInT<std::tuple<Types...>, What> 
{ 
    using Result = What<Types...>; 
}; 

그러나 원하는 템플릿이 가변적 인 템플릿 일 경우 어떻게해야합니까? template <typename...> typename What은 형식 템플릿의 "자리 표시 자"이지만 변수 템플릿의 "자리 표시 자"는 무엇입니까?

나는 clang-4.0.0 (자동 형식의 비 유형 템플릿 매개 변수를 지원하는 유일한 컴파일러)에서 다음을 시도했지만 실패했습니다. 사실 이것은 C++ 17에 대한 올바른 구문인지 확실하지 않습니다.

template < typename Tuple, template <typename...> auto What > 
struct PutTupleInV; 

template < typename... Types, template <typename...> auto What > 
struct PutTupleInV<std::tuple<Types...>, What> 
{ 
    static constexpr auto value = What<Types...>; 
}; 
+0

'decltype (vartempl)'을 사용하여 실제로 변수 템플릿의 유형을 추출 할 수 없습니까? – skypjack

+0

@skypjack 죄송합니다, 무슨 뜻인지 정말로 모르겠습니다. – Vahagn

답변

6

나는 그렇게 생각하지 않습니다. 인용 N4606은 :

§14.3.3 [temp.arg.template]/1

템플릿 템플릿 파라미터위한 템플릿 인수 클래스 템플릿의 이름 아니하며 별칭 템플릿은 id- 표현으로 표시됩니다.

가변 템플릿이이 요구 사항에 적합하지 않습니다.


당신은 약간의 속임수와 템플릿을 선택하기 위해 프록시 유형을 사용할 수 있습니다 : 당신이 말할 수

template<typename...> struct foo{}; 
template<typename... Ts> constexpr foo<Ts...> foo_v{}; 
struct use_foo 
{ 
    template<typename... Ts> 
    static constexpr auto value = foo_v<Ts...>; 
}; 

에 대한 다음

template < typename Tuple, class Proxy> 
struct PutTupleInTV; 

template < typename... Types, class Proxy> 
struct PutTupleInTV<std::tuple<Types...>, Proxy> 
{ 
    static constexpr auto value = Proxy::template value<Types...>; 
}; 

PutTupleInTV<tup, use_foo>::value 

live demo

+0

속임수는 실제로 변수가 "value"라는 이름을 가져야하고 구조체에 배치되어야하므로 많은 도움이되지 않습니다. – Vahagn

+0

@Vahagn 예, 프록시 구조체를 직접 만들어야합니다. 나는이 문제를 해결할 방법이 없다 (아무 것도 없다는 것을 의미하지는 않는다. 나는 어떤 것도 모르고있다) – krzaq

0

PutTupleInTV는 PutTupleInV와 이름이 다릅니다. PutTupleInV 템플릿을 전문으로하지 않지만 PutTupleInTV라는 새로운 구문을 만들기 위해 특수 구문을 사용합니다.

+0

그건 오타입니다. 지적 해 주셔서 고맙습니다. – Vahagn