typedef变量在同一类中。这是一个好习惯吗?
最初我试图键入一个模板类,然后找到“gotw 79”这篇文章。 我不想创建另一个班级,所以我最终做了以下工作。基本上在同一个班级中进行typedef'ing。它很明显。但这是一个好习惯吗?typedef变量在同一类中。这是一个好习惯吗?
谢谢。
嘛,我不是它的忠实粉丝,除非你正在设计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;
这可能是一个很好的做法,如果你决定改变底层的类,typedef
在以后的日子提及并且(可以说)保存拼写错误,并且使代码更容易阅读,即使它永远不会改变,也会更简单。尽管在我看来,这里的名字MyClass_sp
的特殊选择有点不理想。
另外,如果使typedef为public或private是最合适的,也就是说它是否是您的公共接口的一部分,这是值得仔细考虑的吗?
智能指针的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;
};
}
这很好,国际海事组织。
我用了很多。
如果我想使用一个容器,其中的元素是我的模板的类型,我键入它。
如,
template <typename T>
class MyClass {
private:
typedef std::list<T> SomeContainerType;
typedef SomeContainerType::iterator IteratorType;
然后,如果我发现的任何其它结构更合适的,例如作为载体,我可以改变的类型而不触及太多的代码。
谢谢awoodland ..将MyClass_sp更改为shrdPtr。 – blueskin 2010-12-22 17:02:08
当然,因为您可以简单地将`MyClass_sp`类型定义到`unique_ptr`,并且一切都会自然而然地进行。 – 2010-12-22 17:06:50
同意,但在更一般的情况下,例如在两个(兼容)迭代器之间切换会自然地工作。 – Flexo 2010-12-22 17:22:42