2013-08-26 2 views
1
수 있도록 모든 유형을 복용 템플릿을 전문으로하는 방법

조차이 상황에 대한 올바른 용어가 무엇인지 확인합니다. 내가 그걸 알았다면 아마도 그 대답을 발견했을 것이다.가변 길이 배열

나는이의 더 일반적인 구현, 명시적인 전문 없습니다

template<typename T> void write(Buffer& b, const T& value); 

처럼 보이는 플릿 기능을 가지고있다. 예 :

template<> void write<int>(Buffer& b, const int& value) { ... } 
template<> void write<const char *>(Buffer& b, const char * const & value) { ... } 

지금까지 그렇게 좋았습니다. 내가 write(buffer, "hello")로 호출 할 때 그러나 물론 나는

undefined reference to `void write<char [6]>(Buffer&, char const (&) [6])' 

이 오류는 나에게 의미가 불평 링크 오류가 발생합니다. 그러나 내가 알 수없는 것은 이것을위한 전문화를 선언하는 방법이다. 그러한 전문성을 원한다면 char[] 인수를 (const char*)으로 전송하고 기존 전문화라고 부릅니다. 그러나 나는 이것을하는 방법을 이해할 수 없다.

구체적인 예를 들어 나는

template<size_t N> void write<char[6]>(Buffer& b, char const (&value) [6]) 

을 할 수 있지만, 일정한 가능한 모든 길이 문자열이 중 하나를 정의 할 분명히 허용하지 않습니다. 그러나 저는 다음을 시도해 보았습니다. 그 중 일부는 단지 빨대 만 잡는 것이었고 어떤 것도 작동하지 않았습니다.

template<size_t N> void write<char const[N]>(Buffer& ob, char const (&value) [N]) 
template<size_t N> template<> void write<char const[N]>(Buffer& ob, char const (&value) [N]) 
template<> template<size_t N> void write<char const[N]>(Buffer& ob, char const (&value) [N]) 
template<template<size_t N>> void write<char const[N]>(Buffer& ob, char const (&value) [N]) 

적절한 주문은 무엇입니까? 나는 GCC 4.7.3 x86_64를 사용하고있다. 이 OK 인 경우 (예를 들어, char[6]은 나보다는 이러한 경우 char const*을 사용),이를 구현하는 방법은 오버로드를 사용하는 것입니다 문자 배열로 write() 함수를 호출 할 때

답변

0

당신은 템플릿 함수의 부분 특수화 할 수 없습니다. 이 한계를 극복하기 위해 템플리트 화 된 클래스의 함수에 대한 간접 레벨을 수행하는 방법은 this explanation을 참조하십시오.

이 간단한 경우 당신은 또한 템플릿 하나를 호출하는 템플릿이 아닌 write에 의해 얻을 수 :

void write(Buffer &b), const char *v) 
{ 
    write<const char *>(b, v); 
} 

이 효과적으로 인라인 함수의 템플릿 기능이 작동했을 캐스트를 숨 깁니다.

+0

@SnoopyLane -이 질문에 대답 했습니까? – sfjac

+0

매우 늦은 답변에 대해 사과드립니다. 많은 산만 함. 사실, 이것은 문제를 설명해 주었고, 비 템플릿 버전은 제가 결국에 끝났습니다. 비 템플릿은 원래 내가 원했던 것이지만, 일부 메타 프로그래밍에서는주의를 분산시키고 템플릿을 필요로한다고 생각했습니다. 맨 위에 붙여 넣은 스 니펫은이를 단순화했습니다. – SnoopyLane

1

, 인수 유형을 지정하지 char const* 취급하는 (실제로 일반 또는 C-문자열)

void write(Buffer& ob, char const* value) { 
    write<char const*>(ob, value); 
} 

이 함수는 템플릿 인스턴스화보다 바람직하고, 따라서 적절 문자열 상수에 대한 처리를 위임하는데 사용될 수있다.

올바른 형식을 전달해야하는 경우 실제 함수 템플릿을 특수화하지 않고 적절한 멤버 함수로 struct을 즉시 위임하고이 부분을 struct으로 부분적으로 특수화하는 것이 유일한 방법입니다 배열 처리 :

template <int N> 
void write<char const[N]>(Buffer& ob, char const (&value)[N]); // ERROR 

...하지만 그것은 부분적으로 struct을 전문으로 대신하여 시뮬레이션 할 수 있습니다 : 당신이 부분적으로 즉, 함수 템플릿을 전문으로 할 수없는 다음 것은 불법입니다.

+0

감사합니다. 아주 늦은 답장을 드려서 죄송합니다. 그렇다면 "대신 부분적으로 구조체를 특수화하여 시뮬레이션 한"것은 무엇을 의미합니까? 예제에 대한 링크가 있습니까? – SnoopyLane

+0

제 말은 함수를 부분적으로 특수화 된'struct' 즉,'template struct helper;로 감싸는 것입니다. 템플릿 구조체 도우미 {static void write (Buffer & obj, char const (& value) [N]); };' –