使用宏来缩短长卷增强模板名称是一种不好的做法吗?

App*_*ood 1 c++ templates boost visual-c++

我厌倦了编写shared_ptr <>,它极大地延长了代码行.有什么理由不这样做?

GMa*_*ckG 10

为什么要使用宏?这种机制已经存在:

typedef boost::shared_ptr<some_longer_name_omg_help> pointer_type;

pointer_type p; // phew
Run Code Online (Sandbox Code Playgroud)

如果您在评论中询问史蒂夫的建议,可以尝试:

template <typename T>
struct sp
{
    typedef boost::shared_ptr<T> type;
};

typedef sp<some_longer_name_omg_help>::type pointer_type;
Run Code Online (Sandbox Code Playgroud)

但我不知道它是否会短得多.

我认为你的宏观使用是一种懒惰的表现,老实说.boost::shared_ptr在几乎任何合理的"冗长"度量中,都不是很长.你所做的只是破坏了可读性.

  • 我想他想写`sp <omg_all_that_stuff>`,所以他问的是`#define sp boost :: shared_ptr`.由于C++还没有模板typedef,你不能做`template <typename T> typedef boost :: shared_ptr <T> sp;`.最接近的是`template <typename T> struct sp {typedef boost :: shared_ptr <T> t; };`.然后你可以为类型写出`sp <omg> :: t`. (2认同)
  • 不要"到处使用共享指针".对于你*使用它们的少数类型,在每个需要的范围内为每个类型编写一个简单的typedef. (2认同)

jal*_*alf 9

我有一个更简单的建议:使用更少shared_ptr的.如果你如此使用它们,听起来就像是盲目地依赖它们而不是垃圾收集器.C++要求您考虑对象所有权,但如果这样做,大多数智能指针都可以用简单的引用替换,而这些引用并不是冗长的.

你真的需要共享所有权吗?如果你停下来思考几分钟,我相信你可以确定一个对象的所有者,以及它的许多用户,它们只会在用户的生命周期内使用它.因此,只需将其作为所有者的本地/成员对象,并将引用传递给需要使用它的人.

不可否认,这并不能解决一般情况下的问题(还有许多其他冗长的模板名称),但在这种特殊情况下,我认为这是最好的解决方案.


Joe*_*nez 5

这样做的一个原因是新的开发人员生产力.如果您雇用一名新员工,那么他可能会因为了解您如何更改标准boost API的复杂性而感到困惑.

当然,你可能会说,"但我们只会为这种类型做这件事"......我说,"注意那个滑坡";-)