긴 템플릿에 typedef를 사용하는 것과 관련하여 빠른 질문이 있습니다. 요점 : 나는 피클의 일부로 자신을 발견했다. 클라이언트 기능에 로컬이 아닌 typedef를 배치하는 것이 좋지 않은 것 같다. SO 개의 질문 (예 : here 참조)이 있지만 정확하게이 문제를 해결하지 못하는 것 같습니다. 이 질문은 다음에 typedef가 바람직한지 여부를 설명하지는 않습니다 - 설명의 목적으로 단순화하려고했습니다.공유 포인터를 typedef'ing하기위한 최상의 전략은 무엇입니까?
boost::shared_ptr<T>
으로 작업하는 동안 내 문제가 발생했습니다. 기본적으로, 나는 다음을 수행 할 :
#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<Widget> WidgetPtr;
Widget
선언 헤더에이 형식 정의를 배치 못생긴 것 같다. (i) Widget
자체가 구성원에서 공유 포인터를 사용하지 않는 경우 추가 포함을 추가했습니다 (boost::shared_ptr
템플릿을 선언 할 수 없으므로 클래스를 수정하십시오. 다른 클래스 (클래스 Foo
)를 선언 할 때이 typedef를 사용하려면 Widget
을 선언하거나 WidgetFwd.h
을 단순히 전달하는 대신 Widget.h
을 포함하여 권장 사항을 위반합니다. typedef는 후자에서 중복됩니다. 또한 Widget
선언 중에 typedef boost::shared_ptr<Widget>
을 typedef하는 것은 의미가없는 것처럼 보입니다. Widget
의 선언문을 클라이언트가 Widget
인터페이스를 어떻게 사용할 것인지를 예상하여 혼합하는 것처럼 보입니다.
그래, 나쁘다.하지만 이것은 더 나쁘다 : 위의 몇 가지 조합을 시도하지 않으면 클라이언트 코드에서 중복 typedef가 생기게되어 불일치 (따라서 오류 가능성이 있음) - 전체 요점은 주어진 Widget
, WidgetPtr
typedef 자체 유형으로 행동해야한다는 것입니다. 예 : Foo
은 boost::shared_ptr
의 typedef 인 WidgetPtr
을 사용하지 않고 Bar
은 std::auto_ptr
의 typedef로 WidgetPtr을 사용합니다.
또 다른 방법은 (내가 온라인 토론에서 언급 본 적이 그 몇 가지 중 하나)이 타입 정의를 Widget
의 공개 구성원으로하는 다음 Widget::Ptr
사용한다 : 다시
class Widget {
// ...
public:
typedef boost::shared_ptr<Widget> Ptr;
};
을, 나는 '돈 (i) 이것은 포인터 타입이 어떻게 든 클래스의 멤버이고 (ii) 포인터가 우스꽝스러운 인터페이스로 연결된다는 것을 암시한다. 더욱 나쁜 것은 : 필자가 작성한 모든 클래스는 스마트 포인터를 사용하여 잠재적으로 지적 될 수 있기 때문에, 나는 가상의 클라이언트의 꼬리를 쫓아 가게된다. 추악하고 못생긴 추한.
필자는이 코드베이스에서 typedef를 제거하고 (심각한 혼란과 중복을 가져 왔기 때문에) 선택된 함수에서 로컬로 다시 도입했습니다. 여기에도 일관성없는 사용법에 대한 문제가 있지만 심각한 것은 아닙니다.
내가 생각할 수있는 또 다른 해결책은 이것이 좋은 연습으로 간주되는지 확실하지 않습니다. typedef가있는 유틸리티 헤더를 잠재적으로 자체 네임 스페이스 내에 배치하는 것입니다. 이 머리말에서 우리는 그것을 포함하고 끝낼 것입니다.
나는 명백한 것이 없거나 그냥 까다 롭습니다.
PS- 위의 길이에 대한 사과; 문제를 완전히 표현할 수있는 더 간단한 방법을 찾지 못했습니다.
처음에 이것을 typedefing하는 이유는 무엇입니까? 'shared_ptr '이라는 이름은 매우 간단하며 위젯에 대한 공유 포인터입니다. –
Kos
@Kos : 그냥 위젯 대신 위젯 같은 것이 있으면 문제가 발생한다고 생각합니다. 유형이 화면에 맞지 않는 한 빨리 typedef'ing :-) –
Philipp
앞으로 공유 포인터를 변경하지 않으려면 typedefing이 매우 편리합니다. –