gpt4 book ai didi

c++ - 每个类都应该有自己的命名空间吗?

转载 作者:可可西里 更新时间:2023-11-01 14:54:02 40 4
gpt4 key购买 nike

困扰我一段时间的事情:

目前的观点是,类型应该保存在一个命名空间中,它只包含属于类型的非成员接口(interface)的函数(参见 C++ 编码标准 Sutter 和 Alexandrescu 或 here)以防止 ADL 拉入不相关的定义。

这是否意味着所有 类都必须有自己的 namespace ?如果我们假设将来可以通过添加以下内容来扩充一个类非成员函数,那么将两种类型放入与其中任何一个相同的命名空间可能会引入非成员函数这可能会干扰另一个。

我问的原因是 namespace 对我来说变得很麻烦。我是编写一个仅包含 header 的库,我发现自己使用类名,例如项目::组件::类名::类名。他们的实现调用辅助函数,但因为它们不能在同一个命名空间中,所以它们也有完全合格!

编辑:

有几个答案表明 C++ namespace 只是一种避免名称冲突的机制。事实并非如此。在带有参数的 C++ 函数中,使用 Argument Dependent Lookup 解析.这意味着当编译器试图找到一个与函数名称匹配的函数定义时,它会在寻找候选者时查看与其参数类型相同的 namespace 中的每个函数 .

A Modest Proposal: Fixing ADL 中所述,这可能会产生意想不到的、不愉快的后果. Sutter 和 Alexandrescu 的规则声明永远不要将函数放在与类相同的 namespace 中,除非它是该类接口(interface)的一部分。除非我准备为每个类提供自己的命名空间,否则我看不出如何遵守该规则。

非常欢迎更多建议!

最佳答案

没有。我从来没有听说过那个惯例。通常每个库都有自己的命名空间,如果该库有多个不同的模块(例如,功能不同的不同逻辑单元),那么这些可能有自己的命名空间,尽管每个库一个命名空间就足够了。在库或模块命名空间中,您可以使用命名空间 detail或用于存储实现细节的匿名命名空间。每个类使用一个 namespace ,恕我直言,完全矫枉过正。我肯定会回避这一点。同时,我强烈建议您为您的库至少拥有一个命名空间,并将所有内容都放在该命名空间或其子命名空间中,以避免与其他库发生名称冲突。

为了使这个更具体,请允许我使用古老的 Boost C++ Libraries举个例子。 boost 中的所有元素都位于 boost:: 中. Boost 中有一些模块,例如进程间库,它们有自己的命名空间,例如 boost::interprocess::。 , 但在大多数情况下,boost 的元素(尤其是那些经常使用和跨模块使用的元素)简单地驻留在 boost:: 中。 .如果你查看 boost,它经常使用 boost::detailboost::<i>name_of_module</i>::detail用于存储给定命名空间的实现细节。我建议您以这种方式为命名空间建模。

关于c++ - 每个类都应该有自己的命名空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2564135/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com