该库提供了一个派生类,派生类作为模板参数。
示例:
class userclass : public lib::superclass<userclass>
{}
正如你可以看到它打字的很多。并且“userclass”应该始终公开,以使其正常工作。所以我提出了两个看起来像这样的MACRO:
#define SUPER(x) public lib::superclass<x>
#define SUPERCLASS(x) class x : public lib::superclass<x>
用户现在可以输入。
class userclass : SUPER(userclass)
{}
SUPERCLASS(userclass)
{}
但主要的问题是,用户全局命名空间中的宏SUPER和SUPERCLASS存在的速度与包含标题的速度一样快。
可以/我应该:
我正在使用vs 11,该库是针对Windows开发人员的。
答案 0 :(得分:6)
使用宏的第一条规则是“不要,如果有任何其他解决方案”。在这种情况下,还有另一种解决方案,所以要摆脱它们。
其次,你的宏弊大于利,因为人们不知道它们只是通过读它扩展到了什么,而完整的定义确实如此。说真的,你节省了真正微不足道的字符数,以便在可读性方面付出真正可怕的代价。它比简单地写出继承要好得多。
答案 1 :(得分:2)
输入真的不是很多。我已经看到了很多不应该缩短的线条。用宏隐藏它只会混淆你的代码。如果我快速查看你的SUPERCLASS(userclass) {}
,我几乎可以猜测它是一个类(我不喜欢使用基于猜测的库)但是我不知道它是否被调用它userclass
(或两者都没有)或者它正在使用什么样的继承。这意味着你必须记录它,并强迫人们在需要时查找它。
所以正确答案是选项3 - 不要使用宏。
如果你真的真的需要在你的库中使用一个宏,那么给它一个特定于库的前缀。这就像你得到命名空间宏一样接近。
答案 2 :(得分:0)
我投票支持3.只需要用户写出完整的“public lib :: superclass”。
如果符合以下条件,库中的宏可能会非常有用:
但在你的情况下:
我不认为班级名称的重复 - 一个积极的一点 - 是值得的。特别是因为你会隐藏class
关键字并引起读者的一些混淆。
无论如何,如果库使用宏,通常会将库名放在所有宏的前面:
#define MY_FANCY_LIBRARY_NAME_SUPER(x) public lib::superclass<x>
但是现在你没有节省那么多打字......
PS:记住编程的黄金法则:代码只写一次但永远读,因此它应该易于阅读,而不是易于编写。