是否应该从命名空间库中向前声明 类?
Should one forward declare classes from a namespaced library?
我正在设计一个将放置在命名空间内的 C++ 库。
如果我的库的用户只需要我的 classes 之一的前向声明,并且因为你不能在命名空间内做前向声明,例如class ns_name::class_name;
,我应该
- 告诉他们包含包含那个 class 的整个头文件,
或者,为他们提供一种从我的库中转发声明内容的方法?例如:
#define MD_FORWARD_DECLARE(x) namespace md { x; }
然后可以这样使用:
MD_FORWARD_DECLARE(class foo)
值得吗?
- 或者,让他们
namespace md { class foo; }
自己做?
- 或者,如DevSolar所述,制作一个由前向声明组成的专用头文件,如
<iosfwd>
?这对我来说似乎是最优雅的。
正如@molbdnilo 所指出的,使用命名空间进行前向声明没有任何问题。第一个选项根本不是一个选项,出于各种原因我不想包含 header 直到我不得不这样做,前向声明始终是首选方式。
为什么不像许多 boost 实现那样只提供一个带有前向声明的 header 呢?例如提升精神 numerics_fwd.hpp?
啊,错过了@DevSolar 的评论。恕我直言,这是最好的解决方案。
我正在设计一个将放置在命名空间内的 C++ 库。
如果我的库的用户只需要我的 classes 之一的前向声明,并且因为你不能在命名空间内做前向声明,例如class ns_name::class_name;
,我应该
- 告诉他们包含包含那个 class 的整个头文件,
或者,为他们提供一种从我的库中转发声明内容的方法?例如:
#define MD_FORWARD_DECLARE(x) namespace md { x; }
然后可以这样使用:
MD_FORWARD_DECLARE(class foo)
值得吗?
- 或者,让他们
namespace md { class foo; }
自己做? - 或者,如DevSolar所述,制作一个由前向声明组成的专用头文件,如
<iosfwd>
?这对我来说似乎是最优雅的。
正如@molbdnilo 所指出的,使用命名空间进行前向声明没有任何问题。第一个选项根本不是一个选项,出于各种原因我不想包含 header 直到我不得不这样做,前向声明始终是首选方式。 为什么不像许多 boost 实现那样只提供一个带有前向声明的 header 呢?例如提升精神 numerics_fwd.hpp?
啊,错过了@DevSolar 的评论。恕我直言,这是最好的解决方案。