2014-12-21 5 views
0

저는 템플릿이 아닌 클래스에서 템플릿 메서드를 전문화하려고합니다. 메서드의 반환 형식에 템플릿 기반 형식이 포함되어 있습니다.이 메서드는 인수를 사용하지 않습니다. 나는 주위를 돌아 다니고 시행 착오를 거치지 않고 컴파일하는 일을 아무 소용이 없도록하려고 노력했다.템플릿이없는 클래스에서 매개 변수없이 템플릿 메서드를 어떻게 특화합니까?

이 코드를 빌드하려면 어떻게해야합니까? 그러한 구문은 가능한가? (아래 코멘트에 표시된대로 내가 전문적으로 노력하고있어 템플릿 방법은 cBar::getFoos입니다.)

아래

박탈 다운 예제 코드 :

#include <vector> 

//////////////////////////////////////////////////////////////////////////////// 
// the non-templated class below contains std::vector objects of these types 
// (tBuiltInType is an int, float, or bool - but hopefully that's not an 
// assumption that needs to be made, as I'd like to include more complex types) 
template< typename tBuiltInType > 
class cFoo 
{ 
public: 
    // ... 

    void doSomething() 
    { 
     // ... (unimportant what happens here, but stuff happens) 
    } 

private: 
    std::vector<tBuiltInType> m_objects; 
}; 

//////////////////////////////////////////////////////////////////////////////// 
// this contains the templated method I'm trying to specialize - getFoos 
class cBar 
{ 
public: 
    // ... 

    // this is the method I'm trying to specialize by contained type (see private area) 
    // getFoos<int>() would return m_intFoos, etc. 
    template< typename tBuiltInType > 
    std::vector< cFoo<tBuiltInType> > &getFoos(); 

    // (probably unimportant) example use  
    template< typename tBuiltInType > 
    void doSomething() 
    { 
     for (cFoo<tBuiltInType> &foo : getFoos<tBuiltInType>()) 
      foo.doSomething(); 
    } 

private: 
    std::vector< cFoo<int> > m_intFoos; 
    std::vector< cFoo<bool> > m_boolFoos; 
    std::vector< cFoo<float> > m_floatFoos; 
}; 

//////////////////////////////////////////////////////////////////////////////// 
// some (also probably unimportant) example usage code 
int main() 
{ 
    cBar bar; 
    bar.doSomething<int>(); 
    bar.doSomething<bool>(); 
    bar.doSomething<float>(); 

    return 0; 
} 

(나는 내 ​​가족을 방문하고 어떤 노트북이없는거야 , 그래서 내 일반적인 dev에 설치 프로그램을 사용할 수 없습니다 - 내가 대신 노력하고있어 온라인 컴파일러에서 시도에서 오류를 게시 할 수 있지만 많은 사람들이 난해한 온라인 컴파일러 오류를 볼 수 있기 때문에 그것은 여기에 좋은 일을 의심하고 무엇을 알고 그로부터해라. 그러면 약간의 질문 텍스트를 압축하기 위해 그 비트를 건너 뛰겠다.)

+0

http://stackoverflow.com/questions/27582408/let-a- (이 [관련 질문] 참조 function-return-any-type-in-c-class) (최소한 [대답] (http://stackoverflow.com/a/27583037/1413395)). –

+0

그럴 수도 있지만 앞으로 더 복잡한 유형을 추가하고 싶습니다. 그래도 고마워! – counterfeitname

+0

_ "미래에 좀 더 복잡한 유형을 추가하고 싶습니다."_ 우리는 열거를 확장하고 매크로와 코드를 검증하는 유형의 복잡성을 추가하기 위해 몇 가지 특별한 전 처리기 매크로를 사용하여이를 해결했습니다. 컴파일 할 때. –

답변

1

그래서 당신은를 원한다. m_intFoos 등을 반환하는? 올바른 오버로드

template <typename T> struct empty { }; 

template< typename tBuiltInType > 
std::vector< cFoo<tBuiltInType> >& getFoos() 
{ 
    return getFoosImpl(empty<tBuiltInType>{}); 
} 

그리고 제공 :

std::vector< cFoo<int> >& getFoosImpl(empty<int>) { return m_intFoos; } 
std::vector< cFoo<bool> >& getFoosImpl(empty<bool>) { return m_boolFoos; } 
std::vector< cFoo<float> >& getFoosImpl(empty<float>) { return m_floatFoos; } 
1

그냥 클래스에서, 그것을 가서 전문 :

을 나는 간단한 방법은 빈 태그 파견 유형을 소개하는 것입니다 생각
template<> 
std::vector< cFoo<int> >& cBar::getFoos() { return m_intFoos; } 

Working example