如何缩短C ++中的长(合格)标识符?

时间:2014-01-15 01:29:38

标签: c++ namespaces typedef using qualified-name

在Java中,我发现使用命名空间非常简单。对于我在源文件中使用的每个限定标识符Ident,我在文件的顶部放置了import ns1.ns2.ns2.ns3.ns4.Ident;。然后我可以在源代码中的任何地方使用(简短的)不合格的名称。 import语句不会导致任何问题,因为它仅适用于写入它的文件。

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

最常见的解决方案可能是usingusing namespace语句。但是,这似乎是一个相当糟糕的解决方案,至少在头文件的情况下,因为using语句不限于写下它们的单个文件。因此,例如using被排除在外。瘦文库只包含头文件的头文件,一般是在头文件的情况下实现的。

到目前为止,我使用的另一个选项是为类中的每个限定名添加一个类,在类的私有部分中对应typedef。因此,在将此方法与Java进行比较时,我基本上采用整个导入语句列表,将import替换为typedef并将其放在类声明中。

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

好的,现在我们可以将所有这些typedef内容公之于众。但这可能不是一个好主意,因为我们会多次重新定义每种类型。只需考虑一个结构ns1::ns2::ns3::MyStructure和两个类MyClassAMyClassB。这两个类都有一个方法,实际上应该将ns1::ns2::ns3::MyStructure的实例作为参数。但是因为每个类都重新定义了用于去除长限定名称的类型,所以这两种方法现在采用“不同”类型的参数,比如MyClassA::MyStructureMyClassB::MyStructure。当我们有一个第三类MyClassCMyStructure的实例一起使用并且需要用它调用这两个方法时,它变得更加引人注目。此类是否应使用MyClassA::MyStructureMyClassB::MyStructureMyClassC::MyStructure类型声明此实例?

嗯,我只想知道:摆脱命名空间限定符的最佳做法是什么?

0 个答案:

没有答案