Wil*_*ker 168 c++ coding-style typedef
我最近发现自己经常做的事情是声明与该类中的特定类相关的typedef,即
class Lorem
{
typedef boost::shared_ptr<Lorem> ptr;
typedef std::vector<Lorem::ptr> vector;
//
// ...
//
};
Run Code Online (Sandbox Code Playgroud)
然后在代码中的其他地方使用这些类型:
Lorem::vector lorems;
Lorem::ptr lorem( new Lorem() );
lorems.push_back( lorem );
Run Code Online (Sandbox Code Playgroud)
我喜欢它的原因:
std::vector<Lorem>
变成了Lorem::vector
等等.boost::shared_ptr
向量计数并存储在向量中.boost::intrusive_ptr
在稍后阶段被改变为侵入式引用计数(via ),那么这将对代码产生最小的影响.我不喜欢它的原因:
Lorem::vector
在另一个类中嵌入,但只需要(或想要)转发声明Lorem(而不是引入对其头文件的依赖),那么你最终必须使用显式类型(例如boost::shared_ptr<Lorem>
而不是Lorem::ptr
),这有点不一致.我试着对我的编码风格保持客观,所以最好能得到一些其他意见,这样我就可以稍微剖析一下我的想法.
Mar*_*utz 13
它用作意图声明 - 在上面的示例中,Lorem类旨在通过boost :: shared_ptr进行引用计数并存储在向量中.
这正是它没有做到的.
如果我在代码中看到'Foo :: Ptr',我完全不知道它是一个shared_ptr还是一个Foo*(STL有::指针typedef是T*,记得)或者其他什么.ESP.如果它是一个共享指针,我根本不提供typedef,但保持shared_ptr在代码中显式使用.
实际上,我几乎没有在Template Metaprogramming之外使用typedef.
STL一直都在做这类事情
具有根据成员函数和嵌套typedef定义的概念的STL设计是历史的死胡同,现代模板库使用自由函数和特征类(参见Boost.Graph),因为它们不排除内置类型对概念进行建模,因为它使得使用给定模板库的概念设计的类型变得更容易.
不要使用STL作为犯同样错误的理由.
Typdef绝对是好风格.你所有"我喜欢的理由"都是好的和正确的.
关于你遇到的问题.那么,前瞻宣言不是圣杯.您可以简单地设计代码以避免多级依赖.
你可以在类之外移动typedef,但Class :: ptr比ClassPtr更漂亮,我不这样做.就像命名空间一样 - 事物在范围内保持联系.
有时候我做了
Trait<Loren>::ptr
Trait<Loren>::collection
Trait<Loren>::map
Run Code Online (Sandbox Code Playgroud)
它可以是所有域类的默认值,也可以是某些特定类.
归档时间: |
|
查看次数: |
76808 次 |
最近记录: |