2012-05-18 4 views
2

나는 명확한 답을 찾고 있었고, 웹에서 약간의 부분을 잡아 냈습니다.명시 적 템플릿 함수 및 메서드 전문화

나는 함수를 가지고 있으며, 변수에 따라 다르게 행동해야한다. 함수는 인수를 취하지 않으므로 오버로드가 작동하지 않아 템플릿 전문화가 이루어집니다. 예 :

//Calls to this function would work like this: 
int a = f(); 
int b = f<int>(); 
int c = f<char>(); 
//... 

먼저 문법적으로 가능합니까? 나는 그것이있는 것처럼 느낀다. 계속.

이 기능을 정의하는 데 문제가 있습니다. 명시 적 전문화를 위해 구문에 매달렸 기 때문에. 여러 가지 접근법을 시도했지만, 아직 간단한 예제를 얻지 못했습니다.

두 번째로 (필연적으로) 해당 템플릿 함수를 (템플릿이 아닌) 클래스의 템플릿 메서드로 만들려고합니다. 내가 그 다리에 올 때 나는 그 다리를 건너 죠.

감사합니다,
이안

답변

3

글쎄, 그것은 가능하지만 할 수있는 더 좋은 것 중 하나가 아닙니다. , http://www.gotw.ca/gotw/049.htm

+0

감사합니다. 나는 이것을 추측했었다.하지만 링커는 다중으로 정의 된 심볼이 있다고 계속해서 말하고 있었다. – imallett

+0

당신은 머리말에 그것들을 적었고 몇몇 번역 단위들에서 포함 시켰습니까? 템플릿 함수를 명시 적으로 특수화한다는 것은 그러한 의미에서 일반적인 함수와 같습니다. 그것들을'inline' 또는 이름없는 네임 스페이스 (C++'static'에 상응하는 것) 내에서 정의해야합니다. 그렇지 않으면 헤더에서 선언하고 cpp 파일에 정의하십시오. –

+0

예 헤더에 있음; 그러나 경호원이 포함되어 있습니다. 이름없는 네임 스페이스 xor 또는 인라인으로 작업 할 수있었습니다. 그러나, 내가 두 번째 문제 (메서드로 바꾸면)가되면 다시 실패합니다 (인라인 시도). 지금까지 .cpp 파일에 넣는 것처럼, iirc는 C++에서 템플릿을 구현과 분리하는 데 문제가 없었습니까? – imallett

2

우선 심지어 문법적으로 가능하다 :

template< typename T > int f(){ ... } 

template<> int f<int>(){ ... } 
template<> int f<char>(){ ... } 

일부 관련 독서 : 명시 템플릿 기능 전문화 여기에 다소 어두운 구석의,하지만 당신이 그것을하는 방법이다? 나는 그것이있는 것처럼 느낀다.

그것은하지만, 지나치게 복잡하지 않는 것을 –이 단순한 오버로드 필요 :

int f() 
{ 
    return /* default, typeless implementation */; 
} 

template<typename T> 
int f() 
{ 
    return /* type-specific implementation */; 
} 

template<> 
int f<char>() 
{ 
    return /* char implementation */; 
} 

template<> 
int f<int>() 
{ 
    return /* int implementation */; 
} 
+0

int 나 char 등 다른 기능을 어떻게 정의 할 수 있습니까? 죄송합니다; 아마 나는 뭔가를 놓친다. – imallett

+0

@Ian : 그러면 편집 할 때와 같이 전문화하거나 기본 템플릿 내부에 컴파일 타임 상수 인'if' 문을 사용합니다. 구체적 목표없이 구체적인 지침을 제시하는 것은 어렵습니다. – ildjarn

+0

"구체적 목표없이 구체적인 지침을 제시하기가 어렵습니다." 네; 나는 저 자신을 비난합니다. 편집은 기본적으로 우리가 알아 낸 것입니다.첫 번째 템플릿이 아닌 함수가 필요한 이유를 알 수 없습니다. 그래도 도와 ​​줘서 고마워! – imallett

관련 문제