最初,我尝试输入一个模板类,然后进入“gotw 79”文章。 而且我不想创建另一个类,所以我最终做了以下操作。基本上在同一个类中键入。它显然很有效。但这是一个好习惯吗?
template <typename T,typename L>
class MyClass{
typedef std::tr1::shared_ptr<MyClass<T,L> > shrdPtr;
}
谢谢。
答案 0 :(得分:4)
好吧,除非你将MyClass
设计为仅在shared_ptr对象中专门使用,否则我不是它的忠实粉丝,此时我会坚持要求强制执行。
将typedef放在可能与给定对象一起使用的每个不相关的模板实例中有点荒谬。仅仅因为你可能将MyClass
放在shared_ptr中并不是一个很好的理由在那里输入def。你要为std :: vector,map,list,unordered_map,set,deque,....等等添加typedef?
但是如果MyClass
扩展了shared_from_this并且拥有私有/受保护的构造函数,那么它只能被创建并立即分配给shared_ptr,那么......确定......它是接口的一部分。
如果您试图避免输入长参数列表来为具有大量参数的模板化类型实例化shared_ptr,那么更好的选择是EXTERNAL实用程序对象,就像您引用的文章所示:
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;
答案 1 :(得分:1)
是的,尤其是在客户端代码中引用了名称MyClass_sp
时。
答案 2 :(得分:0)
这可能是一种很好的做法,如果您决定更改typedef
稍后引用的基础类并且(可以说)节省拼写错误以及使代码更容易阅读,它会更简单,即使它从不改变。在我看来,MyClass_sp
这个名称的特殊选择还有一些不足之处。
如果将typedef设为public或private是最合适的,那么它是否值得仔细考虑,即它是否是您公共接口的一部分?
答案 3 :(得分:0)
这很好,IMO
我经常使用它
如果我想使用一个容器,哪个元素是我模板的类型,我输入它。
如,
template <typename T>
class MyClass {
private:
typedef std::list<T> SomeContainerType;
typedef SomeContainerType::iterator IteratorType;
然后,如果我发现任何其他更合适的结构,例如矢量,我可以在不触及过多代码的情况下更改类型。
答案 4 :(得分:-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;
};
}