不同命名空间中具有相同名称的类

3

我正在编写一个库。把两个类命名相同但分别放在不同的命名空间中,这是一个不好的想法吗?

使用命名空间:

//forward declaration
namespace sparse {
    class matrix;
}
namespace dense {
    class matrix;
}

namespace dense {
    typedef Index uint64_t;
    class matrix {
        public:
        sparse::matrix tosparse();
    };
}

namespace sparse {
    typedef Index uint32_t;
    class matrix {
        dense::matrix todense();
    };
}

另外,我也可以使用长名称:

class sparse_matrix
...

2
你信任使用库的用户不会使用 using namespace *; 吗?如果答案是否定的,那么这个做法就不是很安全。我建议直接使用完整名称,反正也不长。 - DeiDei
在 @DeiDei 的基础上进一步扩展,这实际上取决于用途。在我看来,很多时候这些可能会一起使用,并且 dense::matrixsparse::matrixdense_matrixsparse_matrix 更长。 - Eli Sadoff
就我个人而言,我会为长命名空间设置别名,并且在使用库时永远不会使用 using namespace *;。但我猜这种情况可能会发生...... - throw_away_account
1
@DeiDei 如果用户说“using namespace whatever;”,导致任何混乱,他们只能怪自己。 - juanchopanza
2个回答

5

总的来说,这很好。这正是命名空间的用途。在这个例子中,设计目标不清楚,因此无法确定这是否是使用命名空间的合适方式。


我尝试使用命名空间来实现以下两个目的:1. 使库的使用更加容易,因为用户可以将命名空间别名为 aaa::bbb::cccabc。2. 减少编写库所需的打字量,因为在 aaa_rangeaaa_iterator 等中重复十几次 aaa_Index_type 不是一件有趣的事情。使用命名空间后,在一个命名空间中只需要 aiteratorIndex_type。我现在正在将 aaa::bbb::ccc 更改回 aaa_bbb_ccc,然后在 aaa_range 中使用公共的 typedef aaa_Index_type Index_type。像 aaa_bbb_simd_parallel 这样的长类名不方便编写或使用,仍然是一个问题。 - throw_away_account
C++ 核心指南建议将辅助函数放在与主类相同的命名空间中(https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-helper)。我想我会将主类和辅助类放在同一个命名空间中。 - throw_away_account

1

是的,这是一个不好的想法。

  1. 可以包含多个命名空间。因此,这相当于写稀疏::矩阵 vs 密集::矩阵。
  2. 清晰度至关重要。sparse_matrix告诉了该对象的行为。
  3. 它们为客户端提供类似/相同的实用程序。为什么需要不同的命名空间?

如果您希望它们具有共同的基础,请进行继承(抽象或非抽象)。


就像 sparse_matrix_stride_rangesparse_matrix_stride_iterator,还有 Sparse_matrix_index_typeSparse_matrix_capacity.colSparse_matrix::Sparse_matrix(const Sparse_matrix_capacity& capacity); 等等。但是我同意,这些缺点对用户来说太糟糕了。 - throw_away_account
@throw_away_account 这是一个不同的问题。您可以始终引入typedef或使用声明来简化它。 - Captain Giraffe
但是这里支持使用命名空间:http://softwareengineering.stackexchange.com/questions/50120/best-practices-for-using-namespaces-in-c 我发现嵌套的命名空间很难维护,因为前向声明几乎是不可能的。 - throw_away_account
2
在我看来,命名空间的目的是为了避免在C语言中通常用于避免冲突的不必要的后缀和前缀。我认为你对这个特定的例子是正确的,但作为一个普遍原则,我不同意。命名空间很棒,因为矩阵可以只是矩阵。 - Justin Meiners

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接