不使用宏来减少函数定义的原因

时间:2014-11-12 21:27:58

标签: c++ templates macros

假设我有一个班级

template
<
  typename ValType,
  typename SizeType        = size_t,
  typename ReservePolitics = double_size
>
class buffer {
public:

    buffer();
    buffer(dimension const& dim);

    // lots of functions ...

};

在其外部定义函数:

template
  <
    typename ValType,
    typename SizeType        = size_t,
    typename ReservePolitics = double_size
  >
buffer<ValType, SizeType, ReservePolitics>::
  buffer() : _Cap(), _Ptr(nullptr), _ResPol() {}

template
  <
    typename ValType,
    typename SizeType        = size_t,
    typename ReservePolitics = double_size
  >
buffer<ValType, SizeType, ReservePolitics>::
  buffer(dimension const& dim) :
    _Cap(), _Ptr(nullptr), _ResPol() { /*...*/ }

// lots of definitions ..

这些定义很难理解。 但是,我可以定义几个宏

#define BUFFHEADER\
  template\
  <\
    typename ValType,\
    typename SizeType      = size_t,\
    typename ReservePolitics = double_size>\
  >

#define BUFFINSTANCE buffer<ValType, SizeType, ReservePolitics>

#define BUFFNAMESPACE BUFFINSTANCE::

这有助于我减少这些定义:

BUFFHEADER BUFFNAMESPACE
  buffer() : _Cap(), _Ptr(nullptr), _ResPol() {}

BUFFHEADER BUFFNAMESPACE
  buffer(dimension const& dim) :
    _Cap(), _Ptr(nullptr), _ResPol() { /* ... */ }

是否有理由不这样做并且每次都用template<...输入孔声明?

2 个答案:

答案 0 :(得分:3)

这些宏应该可以正常工作。不过,我建议不要使用它们。

好的,代码更简洁,可能更容易为您阅读。但是,对于那些阅读您的代码的人来说,这会让人感到困惑。即使您不希望任何人显示代码,也不应该使用宏。如果你给自己一些时间,你将学习如何阅读模板代码。宏只会阻碍你。

让代码更清晰的更好方法是改变换行符的样式。如果您将至少消除几行,代码将更清晰,因为您将能够一次看到更多代码。每个支架都不需要换行。

此外,宏是奇特的。一般你不应该使用他们的。 @Adrian Maire在上面的帖子中写了更多关于它的内容。

答案 1 :(得分:2)

宏是一个功能强大的工具,但它可能带有非常模糊(难以理解和调试)的代码。

宏似乎可以正常工作并在其他情况下失败,这就是为什么通常需要使用特殊规则(使用括号等)来编写宏。

Macro的大多数用途都有更好,更安全和等效的方法来制作相同的内容。

宏有助于缩短代码,但这通常并不意味着更容易阅读或编译。更短!=更好

这就是为什么宏是程序员倾向于禁止的goto / labels,break / continue,return abuse等技术之一。

对于某些非常特定的目的,宏可能仍然有用,但如果没有充分的理由使用它们,则应该避免使用它们。这应该回答你的问题。