2012-06-13 4 views
10

템플릿에 전달 된 변수 유형을 확인하고 int 또는 std::string 등일 경우에 기반한 함수를 호출하는 방법이 있습니까? 내가 그 코드를 사용하려고하면 예를템플릿 변수 유형에 따라 다른 방법 수행

template <class T> 
struct Jam 
{ 
    Jam(T *var) 
    { 
     if (typeid(var) == typeid(std::string*) 
       *var = "Hello!"; 
     else if (typeid(var) == typeid(int*) 
       *var = 25; 
    } 
}; 

를 들어

, 나는 오류 invalid conversion from const char* to int를 얻을. 컴파일러가 별도의 함수로 템플릿을 "확장"하고 구조체의 새 인스턴스를 지정할 때 throw Jam<std::string>(&setme);var* = 25 문을 감지하고 컴파일을 거부했기 때문에 이것이 의심 스럽습니다.

적절한 방법이 있습니까? 아마 매크로 경비원이 있겠 니? 감사. 대신 오버로드

답변

12

를 사용하여 일반 기능 :

template <class T> 
struct Jam 
{ 
    Jam(std::string* var) 
    { 
     *var = "Hello!"; 
    } 

    Jam(int* var) 
    { 
     *var = 25; 
    } 
}; 

당신이 Jam을 인스턴스화하는 데 사용 유형 T에 전문하려는 경우가 아니면

. 그럴 경우 :

template<> 
struct Jam<std::string> 
{ 
    Jam(std::string* var) 
    { 
     *var = "Hello!"; 
    } 
}; 

template<> 
struct Jam<int> 
{ 
    Jam(int* var) 
    { 
     *var = 25; 
    } 
}; 


template<typename T> 
struct Jam 
{ 
    Jam(T* var) 
    { 
     // every other type 
    } 
}; 
+1

예를 들어 생성자 ('template <> Jam :: Jam (int * var) {}'만 템플릿 클래스 정의 외부) 또는 코드 기반을 사용/사용하지 않도록 설정하는 더 복잡한 SFINAE 템플릿 인자에 관해서 ... 나는이 간단한 문제에서는 의미가 없다고 생각하지만,이 단순한 솔루션이 부담이 될 때 말이 될 수 있습니다. (생성자가 100 가지를했는데 그 중 하나만 유형에 의존한다고합시다 또는 100 개의 다른 멤버 함수가 있고 전체 유형을 전문화하는 것이 비쌀 것입니다) –

6

"부분 템플릿 전문화"를 찾으십시오.

template <class T> 
struct Jam 
{ 
    Jam(T *var); 
}; 

지금이 몸을 쓰기 :

테이크 잼()의 잼 {} 중 몸

Jam<int>::Jam(int *var) { 
    // stuff 
} 

Jam<std::string>::Jam(std::string *var) { 
    // stuff 
} 

(경고 :. 러 C++ 그러나 그것은 일반적으로 당신이 그것을 할 방법입니다.)

새로운 질문 : 오리 타이핑이 필요한 경우 C++을 전혀 사용하지 않는 이유는 무엇입니까? Ruby로 전환하고 속도가 필요한 플러그인 용 C++를 저장합니다. 그러나 C++은 여전히 ​​더 많은 작업을 통해 우아한 디자인을 지원합니다!

+1

+1, 이것은 일반적으로 * partial * 템플릿 전문화라고는하지 않습니다. * partial * in * partial template specialization *은 일반적으로 모든 템플릿 인수가 고정 된 * 전체 전문화 *와 비교하여 특정 유형의 하위 집합에만 특성화가 적용된다는 사실을 나타냅니다. –

+2

거룩한 쓰레기. 나는 C++을 알고 있었습니까? 아무 것도 폭발하지 않았 으면 좋겠다! – Phlip

+0

@Phlip 방금 우주 왕복선 발사에서 코드를 사용했습니다. 화재로 인해 모든 사람이 사망하고 도시가 파괴되었습니다. 고마워. – Andrew