2012-11-30 6 views
5

템플릿 템플릿 및 매개 변수 공제에 문제가 있습니다. 코드는 다음과 같습니다.템플릿 템플릿 함수 및 매개 변수 공제

template<typename U, template<typename> class T> 
void test(T<U>&& t) 
{ 
    ... 
} 

이 값은 lvalues와 rvalues ​​중 하나를 받아 들일 것으로 예상되지만 rvalues에서만 작동합니다. 이 경우 붕괴 규칙 "T & & & = T &"이 적용되지 않습니까?

당연히 lvalue 참조 함수도 선언 할 수 있지만 코드를 읽기 쉽게 만듭니다.

내가 왜 이것을 요구하는지 묻는다면 이 특정 클래스인지 static_assert를 사용하는 것입니다. 그렇게 간단한 방법이 있다면 코드를 변경해 드리겠습니다 만 템플릿 템플릿이 이런 식으로 사용할 수 있는지 알고 싶습니다. 참조 형식으로 추론 할 수

감사

typename T 달리

답변

2

는, template<typename> class T은 아무리 T<U>는 항상 객체 타입으로 추론되어, 클래스 템플릿을 것으로 추론 할 수있다.

당신은 당신의 기능은 다음 static_assert의 템플릿 유형 풀고 T에 템플릿 작성할 수 있습니다

template<typename T> struct is_particular_class: std::false_type {}; 
template<typename U> struct is_particular_class<ParticularClass<U>>: std::true_type {}; 

template<typename T> void test(T &&) { 
    static_assert(is_particular_class<std::remove_reference<T>::type>::value, "!"); 
} 
관련 문제