2009-04-15 3 views
1

템플릿 매개 변수를 기반으로 복잡한 데이터 구조를 사용하는 템플릿 기능 fct이 있습니다. 또한 별도의 helpers 네임 스페이스에있는 일부 도우미 함수 (동일한 유형으로 템플릿 됨)를 호출하고 동일한 복합 데이터 구조를 사용합니다. 템플리트 된 네임 스페이스 및 typedef는 비공식 - 해결 방법입니까?

namespace helpers { 
    template<class T> 
    void h1(const std::vector< std::vector< std::map<T, std::set<T> > > >& bar){ 
    // ... 
    } 
} 

template<class T> 
void fct(const std::vector< std::vector< std::map<T, std::set<T> > > >& bar){ 
    // ... 
    helpers::h1(bar); 
} 

가 지금은 모든 기능을 사용할 수있는 하나의 형식 정의를 사용하여, 그것은 예쁘게 만들고 싶어 : 우리는 모든 기능에 액세스 할 수있는 복합 형에 대해 하나의 typedef을 할 수 없기 때문에 지금은 정말 추한 가져옵니다.

A는 좋은 것 typedef을 템플릿 있지만 허용하지 않는다 :

template<class T> 
typedef std::vector< std::vector< std::map<T, std::set<T> > > > Bar; 

또 다른 해결책은 내가 템플릿 namespace이 모든 기능을 포장, 생각하지만, 그 C에서 허용하지 않는다 될 것 ++ 중 하나 (I를 그것이`C++ 0x '에있을 것이라고 들었습니다 ...).

물론 템플릿 기반 클래스가 있지만 실제로 사용자가 객체를 만들고 멤버 함수를 호출해야하는 것은 아닙니다.

template<class T> 
class All { 

    typedef std::vector< std::vector< std::map<T, std::set<T> > > > Bar; 

    static void fct(const Bar& bar){ 
    // ... 
    h1(bar); 
    } 

private: 
    static void h1(const Bar& bar){ 
    // ... 
    } 
}; 

내 질문은 : 내 코드의 대부분이 그렇게 구성되어 있다면 그것은 아마 조금 재미 그래서 내가 사용 결국 해결 방법은 모든 멤버 함수가 static을 어디에 템플릿 기반 클래스를 사용했다? 결국 정적 멤버 함수만으로 많은 클래스를 가지는 것이 약간 이상한가요? "templated typedef"/ "templated namespace"를 가능하게하는 다른 해결책/해결 방법이 있습니까?

+0

중복 된 http://stackoverflow.com/questions/251432/typedefs-for-templated-classes. –

답변

8

"템플릿 기반 typedef"/ "templated 네임 스페이스"를 만들 수있는 다른 해결 방법이 있습니까?

GOTW #79: Template Typedef

The New C++ Typedef Templates (섹션 1 : 문제 및 현재 해결 방법) :이 C++ (11)와 포스트 C++ 11 세계에서이 질문을 읽는 사람들을위한

+0

나는 GOTW # 79 : 특성 정의와 동일한 해결책을 제안하려고했습니다. +1 –

0

는이 '실제로 완전히 형식 정의 대체 할 수있는 ('사용이라고하는 템플릿 typedef이다 질문의 맥락에서, 여기에 우리가하는 일이다.

template<class T> 
using Bar = std::vector< std::vector< std::map<T, std::set<T> > > >; 

namespace helpers { 
template<class T> 
void h1(const Bar<T>& bar){ 
    // ... 
} 
} 

template<class T> 
void fct(const Bar<T>& bar){ 
    // ... 
    helpers::h1(bar); 
} 

멋지고 간단합니다. 일종의.