2010-12-22 2 views
1

처음에는 템플릿 클래스를 typedef하려고했는데 "gotw 79"문서가 있습니다. 그리고 나는 다른 수업을 만들고 싶지 않았기 때문에 다음과 같이 끝내었다. 기본적으로 같은 클래스 안에 typedefing됩니다. 그것은 명백하게 작동합니다. 그러나 그것은 좋은 습관입니까? 같은 클래스 안에 typedef 변수가 있습니다. 좋은 습관입니까?

template <typename T,typename L> 
class MyClass{ 
    typedef std::tr1::shared_ptr<MyClass<T,L> > shrdPtr; 
} 

감사합니다.

답변

4

그럼 당신은 어떤 시점에서, 특히 만 shared_ptr의 개체 내에서 사용할 수 MyClass을 설계하지 않는 한, 나는 그것의 큰 팬이 아니에요 나는 그 요구 사항을 강요 할 것을 주장 할 것이다.

주어진 개체에 사용할 수있는 관련이없는 템플릿 인스턴스화마다 typedef를 넣는 것은 약간 우스운 일입니다. 그냥 MyClass을 shared_ptr에 넣을 수 있기 때문에 거기에 typedef를 지정하지 않는 것이 좋습니다. 당신은 std :: vector, map, list, unordered_map, set, deque, .... 등의 typedef를 넣을 것인가?

그러나 MyClass이 shared_from_this를 확장하고 개인/보호 된 생성자를 가지고 있기 때문에 오직 생성되어 즉시 shared_ptr에 할당 될 수 있습니다. 그러면 확실히 ... 인터페이스의 일부입니다.

당신은 더 나은 내기가 외부 유틸리티 오브젝트는 당신이 인용 된 문서에 표시처럼 다음 매개 변수를 많이 가진 템플릿 유형에 대한 shared_ptr의 인스턴스를 긴 매개 변수 목록을 입력 할 필요가 없도록하려는 경우 :

template < typename T > 
struct instantiate_shared_ptr { typedef shared_ptr<T> type; }; 

template < typename after typename > struct my_complex_template {}; 
typedef my_complex_template<some parameters> mct_1; 
typedef instantiate_shared_ptr<mct_1>::type mct_1_sp; 
+0

C++ 0x는 "앨리어싱"템플릿 클래스에 대한 구문을 제공한다고 생각합니다. 누구나 구문을 기억합니까? – davka

+0

http://en.wikipedia.org/wiki/C%2B%2B0x#Template_aliases - 필자가 사용해야하는 컴파일러에는 적어도 구현되어 있지 않으므로 필자는이를 권장하지 않는다. 가장 일반적인. 하지만 그래, 다른 방법이야. 다른 한편으로, 나는 그들이 나의 구체적인 예를 실제로 도울 것이라고 의심하지 않는다. –

+0

노아 감사합니다. 템플릿 별칭이 내 문제에 대한 대답이지만 GCC가 아직 지원하지 않는다고 생각합니다. 어떤 대안? – blueskin

0

typedef이 나중에 참조 할 기본 클래스를 변경하고 오히려 오타를 저장하고 변경하지 않는 경우에도 코드를 읽기 쉽게 만드는 것이 더 간단 할 수 있습니다. 이름의 특별한 선택은 여기에 MyClass_sp 내 생각에 원하는 될 조금 나뭇잎.

typedef를 공개 또는 비공개로 설정하는 것이 가장 적절한 경우 즉 공개 인터페이스의 일부인 경우 신중하게 생각해 볼 가치가 있습니까?

+0

감사합니다.MyClass_sp를 shrdPtr로 변경했습니다. – blueskin

+0

물론,'unique_ptr'에'MyClass_sp'를 typedef 할 수 있기 때문에 모든 것이 자연스럽게 작동합니다. –

+0

동의하지만 더 일반적인 경우에는 두 개의 (호환 가능한) 반복자 사이를 전환하면 자연스럽게 작동합니다. – Flexo

1

예, 특히 클라이언트 코드에서 MyClass_sp이라는 이름을 사용하는 경우 코드를 사용하면 (및 개발자를 방지하면서이 클래스 정의 근처에 스마트 포인터 (고화질)을 유지

namespace N 
{ 
    class A 
    { 
    }; 

    typedef std::tr1::shared_ptr<A> APtr; 
} 

:

+0

Erm,이 'MyClass_sp'는 어디서 왔는가? – sbi

+0

@sbi : sry ... 나는 글을 바 꾸었습니다. MyClass_sp는 shrdPtr – blueskin

+0

입니다. 이는 MyClass_sp가 왜 유효하고 합당한 방법으로 변경 될 수있는 경우에만 적합합니다. 이 경우에는 합리적인 일이 아닙니다. shared_ptr 객체는 매우 특정한 방식으로 동작합니다. 그 타입을 대체하려고한다면, 똑같은 행동을하는 것이 더 좋을 것입니다. 그렇지 않으면 클라이언트가 어쨌든 부서 질 것입니다. shared_ptr을 대체하려면 대체로 동일하거나 더 작게 작성해야합니다. 따라서 그렇게 할 필요가 없습니다. –

-1

스마트 포인터 형식 정의에 대한 더 나은 솔루션은 헤더의 클래스 정의 후에을하는 것입니다)는 A::APtr a(new A) (이상하게 보입니다)과 같은 코드를 작성하지 않아도됩니다. 그는 템플릿 클래스에 관심을하기 때문에 :

편집

namespace N 
{ 
    template<class T, class L> 
    class A 
    { 
    }; 

    template<class T, class L> 
    struct A_Instantiator 
    { 
     typedef std::tr1::shared_ptr<A<T, L> > APtr; 
    }; 
} 
+4

문제는 템플릿 typedef를 가질 수 없다는 것입니다. 즉, 템플릿을 직접 만들 수 없습니다. typedef std :: tr1 :: shared_ptr > shrdPtr; 그게 우리가 위의 접근법을 사용하는 이유 – blueskin

+0

그러나 T와 L에 어떤 유형이 사용될 것인지 알면 typedef를 전문화 할 수 있습니다. 완전히 일반적인 코드를 작성하려고한다면 다른 해결책이 필요합니다 (심지어 볼 때 추한 경우). –

0

괜찮습니다.
나는 그것을 많이 사용했다.
요소가 내 템플릿의 형식 인 컨테이너를 사용하려면 해당 템플릿을 typedef로 지정합니다. 나는 그런 벡터로 더 적합한 다른 구조를 발견하면
같은

template <typename T> 
class MyClass { 
private: 
    typedef std::list<T> SomeContainerType; 
    typedef SomeContainerType::iterator IteratorType; 

그런 다음, 나는 너무 많은 코드를 건드리지 않고 유형을 변경할 수 있습니다.

관련 문제