如何在 C++ 中缩短长(限定)标识符?

问题描述 投票:0回答:1

在 Java 中,我发现使用命名空间非常简单。对于我在源文件中使用的每个合格标识符

Ident
,我在文件顶部放置了一个
import ns1.ns2.ns2.ns3.ns4.Ident;
。然后我可以在源代码中的任何地方使用(短)非限定名称。
import
语句不会引起任何问题,因为它仅适用于写入该语句的文件。

但是,我不太确定如何以最好的方式摆脱 C++ 中的命名空间限定符。

最明显的解决方案可能是

using
using namespace
声明。然而,这似乎是一个相当糟糕的解决方案,至少在头文件的情况下是这样,因为 using 语句并不限于记录它们的单个文件。因此,在例如以下情况下,
using
被排除在外。仅包含头文件的精简库,其实现直接在内部或一般情况下是头文件。

到目前为止我使用的另一个选项是在类的私有部分为我在类中使用的每个限定名称添加相应的

typedef
。因此,当将此方法与 Java 进行比较时,我基本上采用整个导入语句列表,将
import
替换为
typedef
并将其放在类声明中。

但是,我不太喜欢这种方法,因为严格来说,我的类的用户不知道返回值和参数值的类型,因为方法声明中的类型是相应类的私有类型。

好的,现在我们可以将所有这些

typedef
的东西公开。但这可能不是一个好主意,因为我们会多次重新定义每种类型。想想一个结构体
ns1::ns2::ns3::MyStructure
和两个类
MyClassA
MyClassB
。这两个类都有一个方法,实际上应该将
ns1::ns2::ns3::MyStructure
的实例作为参数。但是因为每个类都重新定义了它用来摆脱长限定名称的类型,所以这两个方法现在采用“不同”类型的参数,例如
MyClassA::MyStructure
MyClassB::MyStructure
。当我们有第三个类
MyClassC
时,它会变得更加吸引人,它与
MyStructure
的实例一起使用,并且需要用它调用这两个方法。该类是否应该使用类型
MyClassA::MyStructure
MyClassB::MyStructure
MyClassC::MyStructure
声明此实例?

好吧,我只想知道的是:摆脱命名空间限定符的最佳实践是什么?

c++ namespaces typedef using qualified-name
1个回答
0
投票

我生成的所有命名空间都嵌套在我的用户名命名空间中,该命名空间的名称很短。

您可以在用户名命名空间内生成一个语义上有意义的命名空间名称,然后将其用作某些非常长的路径的别名,从而帮助将其与变量冲突隔离。

您不需要为此调用类型定义的危险。您可以简单地使用语义上有意义的命名空间别名 (https://en.cppreference.com/w/cpp/language/namespace_alias):

  • 假设我的根命名空间是 mr_user,我的项目名称是 Colored_balloons。
命名空间 mr_user_cb01_psp =
mr_user::colored_balloons::my_package_namespace::my_subpackage_namespace;

mr_user_cb01_psp::MyClass myClass;

根据您如何使用它,为了避免长期冲突,您可能应该在项目之外的安全位置跟踪您的命名空间别名。大多数时候我不关心这个:我只是使用完全限定形式的原始命名空间名称。

© www.soinside.com 2019 - 2024. All rights reserved.