假设我有一个班级
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<...
输入孔声明?
答案 0 :(得分:3)
这些宏应该可以正常工作。不过,我建议不要使用它们。
好的,代码更简洁,可能更容易为您阅读。但是,对于那些阅读您的代码的人来说,这会让人感到困惑。即使您不希望任何人显示代码,也不应该使用宏。如果你给自己一些时间,你将学习如何阅读模板代码。宏只会阻碍你。
让代码更清晰的更好方法是改变换行符的样式。如果您将至少消除几行,代码将更清晰,因为您将能够一次看到更多代码。每个支架都不需要换行。
此外,宏是奇特的。一般你不应该使用他们的。 @Adrian Maire在上面的帖子中写了更多关于它的内容。
答案 1 :(得分:2)
宏是一个功能强大的工具,但它可能带有非常模糊(难以理解和调试)的代码。
宏似乎可以正常工作并在其他情况下失败,这就是为什么通常需要使用特殊规则(使用括号等)来编写宏。
Macro的大多数用途都有更好,更安全和等效的方法来制作相同的内容。
宏有助于缩短代码,但这通常并不意味着更容易阅读或编译。更短!=更好
这就是为什么宏是程序员倾向于禁止的goto / labels,break / continue,return abuse等技术之一。
对于某些非常特定的目的,宏可能仍然有用,但如果没有充分的理由使用它们,则应该避免使用它们。这应该回答你的问题。