2014-03-14 7 views
0

내가 가지고있는 다음 코드 가변성 템플릿으로 템플릿 전문화를 처리하는 방법은 무엇입니까?

#include <iostream> 
#include <tuple> 

static inline void print (void) 
{ 
    ; 
} 

template <typename Head, typename... Tail> 
static inline void print (Head h, Tail... t) 
{ 
    std::cout << h << std::endl; 
    print(t...); 
} 

int main(int argc, char *argv[]) 
{ 

    print("string", 42, 3.43, true, 'c'); 

    return 0; 
} 

예를 들어,로, 첫 번째 유형, 머리를 전문으로 할 수있는 방법이 있나요, 부울

? 내가 바라는 것은 이것을하기 위해 필요한 적절한 구문입니다. 이 여분의 템플릿을 추가하려고 시도했습니다.

template <bool, typename... Tail> 
static inline void print (bool h, Tail... t) 
{ 
    std::cout << "I'm a bool!" << std::endl; 
    print(t...); 
} 

사용할 수 없습니다.

답변

8

C++에는 함수 템플릿의 부분 특수화 같은 것이 없습니다.

이는 C++ 03 및 C++ 11에서도 마찬가지이며 가변적 인 템플릿뿐만 아니라 모든 함수 템플릿에도 적용됩니다.

당신은 비록 함수를 오버로드 할 수 있습니다 : 첫 번째 인수가 bool 때 오버로드

template <typename... Tail> 
static inline void print (bool h, Tail... t) 
{ 
    std::cout << "I'm a bool!" << std::endl; 
    print(t...); 
} 

사용됩니다.

2

함수 오버로드이면 충분하지만 모든 서명을 먼저 선언해야합니다. 아래 코드는 here이지만 bool 오버로드 선언을 제거하면 here과 같이 선택되지 않습니다.

#include <iostream> 

void print (void){} 
template <typename... Tail> 
void print (bool b, Tail&&... t); 
template <typename Head, typename... Tail> 
void print (Head&& h, Tail&&... t); 


template <typename Head, typename... Tail> 
void print (Head&& h, Tail&&... t) { 
    std::cout << std::forward<Heal>(h) << " "; 
    print(std::forward<Tail>(t)...); 
} 

template <typename... Tail> 
void print (bool , Tail&&... t) { 
    std::cout <<"bool" << " "; 
    print(std::forward<Tail>(t)...); 
} 

int main(int argc, char *argv[]) { 
    print("string", 42, true, 3.43, true, 'c'); 
    return 0; 
} 

편집 : 실제 솔루션에 대한 범용 참조가 추가되었습니다.