2010-12-22 103 views

回答

4

嘛,我不是它的忠实粉丝,除非你正在设计MyClass只内shared_ptr对象具体使用,在该点我会坚持要求被强制执行。

对于您可能与给定对象一起使用的每个不相关的模板实例化,放入typedef有点荒谬。仅仅因为你可能会把MyClass放在shared_ptr中并不是在那里键入def的好理由。你打算把std :: vector,map,list,unordered_map,set,deque,....等等等等的typedefs?

但是,如果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

这可能是一个很好的做法,如果你决定改变底层的类,typedef在以后的日子提及并且(可以说)保存拼写错误,并且使代码更容易阅读,即使它永远不会改变,也会更简单。尽管在我看来,这里的名字MyClass_sp的特殊选择有点不理想。

另外,如果使typedef为public或private是最合适的,也就是说它是否是您的公共接口的一部分,这是值得仔细考虑的吗?

+0

谢谢awoodland ..将MyClass_sp更改为shrdPtr。 – blueskin 2010-12-22 17:02:08

+0

当然,因为您可以简单地将`MyClass_sp`类型定义到`unique_ptr`,并且一切都会自然而然地进行。 – 2010-12-22 17:06:50

+0

同意,但在更一般的情况下,例如在两个(兼容)迭代器之间切换会自然地工作。 – Flexo 2010-12-22 17:22:42

1

是的,特别是如果在客户端代码中引用名称MyClass_sp

+0

呃,这个`MyClass_sp`应该来自哪里? – sbi 2010-12-22 17:11:13

-1

智能指针的typedef更好的解决方案是在头类定义后做他们:

namespace N 
{ 
    class A 
    { 
    }; 

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

这样可以使你的智能指针确定指标接近你的类定义,同时防止你(及任何开发人员使用的代码)不必编写像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; 
    }; 
} 
0

这很好,国际海事组织。
我用了很多。
如果我想使用一个容器,其中的元素是我的模板的类型,我键入它。
如,

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

然后,如果我发现的任何其它结构更合适的,例如作为载体,我可以改变的类型而不触及太多的代码。

相关问题