2017-10-11 2 views
3

형식 및 인쇄 정보를 담당하는 메서드를 작성하고 있습니다.템플릿 형식이 자체 템플릿 형식인지 검색

boost::optional<T>에 문제/기능이 있습니다. 에 값이있는 경우에만 will print an extra blank space을 스트림으로 출력 할 때 문제가 발생합니다. 두 개의 서로 다른 기능을 사용

  • : 인수 유형 boost::optional<T>과 거래의 경우 감지 할 수있는 명시 적으로 boost::optional<T>
  • 은 하나의 기능을 사용하여 다루는 일반적인 하나는

    나는 두 가지 옵션을 볼 수 있습니다

    : 함께 따라

는 옵션 1은 다음과 같이 될 수있다

template <typename T> 
void print(const T& o) 
{ 
    std::cout << o << "\n"; 
} 

template <typename T> 
void print_optional(const boost::optional<T>& o) 
{ 
    if (o) 
     print(*o); 
    else 
     print("--"); 
} 

print()boost::optional으로 지정하면 컴파일 오류가 발생하지 않는다는 문제점이 있습니다. 나는 static_assertstd::is_type, 을 알고 있지만 boost::optional은 그 자체가 템플릿이되어 있기 때문에 나는 그것을 어떻게 체크 할 지 모릅니다.

옵션 2 나를 위해 이상적인 것, 그러나 문제는 남아 : 어떻게 변수에 관계없이 T의 boost::optional<T>인지 코드를 물어?

+0

제기 된 질문 : "할 수 없습니다". 유형은 유형입니다. 그러나, 당신은 원하지 않습니다, 당신은 (부분) 전문화를 과부하하고 싶습니다. – sehe

답변

3

템플릿 과부하로 문제를 해결해야했다; 귀하의 질문에 직접 답하는 경우 유형이 부분 전문화가 적용된 클래스 템플릿을 통해 boost::optional이라는 인스턴스인지 여부를 확인할 수 있습니다.이전 답변의 제시하지 않는 솔루션을 추가

template <typename> 
struct is_optional : std::false_type {}; 

template <typename T> 
struct is_optional<boost::optional<T>> : std::true_type {}; 

template <typename T> 
void print(const T& o) 
{ 
    static_assert(!is_optional<T>::value, "Please use print_optional instead."); 
    std::cout << o << "\n"; 
} 
1

그냥 과부하 print는 :

template <typename T> 
void print(const T& o) 
{ 
    std::cout << o << "\n"; 
} 

template <typename T> 
void print(const boost::optional<T>& o) 
{ 
    if (o) 
     print(*o); 
    else 
     print("--"); 
} 
5

당신은 방금 print 기능 과부하 수 : 당신이 그렇지 않으면 boost::optional, 첫 번째 오버로드를 전달하는 경우

template <typename T> 
void print(const T& o) 
{ 
    std::cout << o << "\n"; 
} 

template <typename T> 
void print(const boost::optional<T>& o) 
{ 
    if (o) 
     print(*o); 
    else 
     print("--"); 
} 

이 올바르게 두 번째 오버로드를 선택합니다. 다른 답변으로

Live demo

+0

사실, boost 변형은 이것을 상자에서 꺼내지 만 (공백을 추가합니다) : http://coliru.stacked-crooked.com/a/bbaa09f05dabfa90 – sehe

+0

@sehe 그 질문에 지적 된 :) – TartanLlama

0

:

당신은 유형이 같은 optional 있는지 확인하기 위해 템플릿 특수화와 구조체를 사용할 수 있습니다

: 이제

template <typename> 
struct is_optional : std::false_type {}; 

template < typename T > 
struct is_optional<std::optional<T>> : std::true_type {}; 

, std::enable_if_t을 사용하여 optional<T> 입력 및 기타 입력에 대해 다르게 동작하는 단일 메소드를 가질 수 있습니다.

template < typename T > 
std::enable_if_t<!is_optional<T>::value, void> print(const T& o) 
{ 
    std::cout << o << "\n"; 
} 

template < typename T > 
std::enable_if_t<is_optional<T>::value, void> print(const T& o) 
{ 
    if (o) 
     print(*o); 
    else 
     print("--"); 
} 

참고 : 더 읽기, 깨끗하고 is_optional 구조체를 필요로하지 않습니다,하지만 그럼에도 불구하고 유효한 구현하기 때문에 optional<T> 명시 적 방법을 과부하가, 더 나은 솔루션입니다.