2014-10-14 4 views
0

죄송합니다. 오랜 질문이지만 죄송합니다. 특정 문제입니다. 템플릿의 클래스에서 유형 가져 오기

의 나는 두 개의 클래스, type1type2 있다고 가정 해 봅시다 : 당신이 볼 수 있듯이 그들은 getVal()에 의해 반환 유형을 제외하고 동일한 기능을 수행

struct type1 { 
    int getVal() { 
     return int(); 
    } 
}; 
struct type2 { 
    float getVal() { 
     return float(); 
    } 
}; 

합니다. 자, type1 또는 type2을 입력으로 받아들이고 각각 ​​intfloatstd::vector을 출력하는 함수를 만들고 싶다고 가정 해 보겠습니다.

내가 이런 템플릿 기능을 만드는 것이 었습니다 할 생각 방법 :

template<class T> vector<oh dear> something(T input) { 
    return {input.getVal(),input.getVal()}; 
} 

이 거의 작동을하지만, 당신이 oh dear에서 볼 수 있듯이, 내가 벡터의 올바른 유형을 만들 수 없습니다 돌려 주다. 유형은처럼 type1type2 클래스에서 반환 단순히 typedef에 : 그래서 그에 대한 해결책을 생각

struct type1 { 
    int getVal() { 
     return int(); 
    } 
    typedef int subtype; 
}; 
struct type2 { 
    float getVal() { 
     return float(); 
    } 
    typedef float subtype; 
}; 

그리고이 할 수있는 기능 변경 :

template<class T> vector<T::subtype> something(T input) { 
    return {input.getVal(),input.getVal()}; 
} 

하는 컴파일되지 않습니다 . 내가 가지고있는 문제를 해결할 방법이 있습니까?

답변

2

당신은 당신이 유형 자동

template<class T> 
auto something(T input) -> std::vector<decltype(input.getVal())> { 
    return {input.getVal(),input.getVal()}; 
} 
에서 컴파일러 그림하도록 할 수 있습니다, 그것은 유형

template<class T> 
std::vector<typename T::subtype> something(T input) { 
    return {input.getVal(),input.getVal()}; 
} 
C++ (11)와

In Coliru

입니다 컴파일러에게 T::subtype 전에 typename 키워드를 추가해야

In Coliru

+0

그래서'typename' 키워드가 무엇을위한 것입니까! 그리고 그것은'decltype'을위한 것입니다! 나는 당신을 사랑하고, 자동차가 반환 유형이 될 수 없다는 것을 결코 알지 못했다. 나는 ♥ C++ 11을 너무 많이, 고마워! 최고의 해답. – BWG