从嵌套的名称空间注入类型:使用Typedef

Injecting types from nested namespaces: Typedef or using?

本文关键字:类型 使用 Typedef 注入 空间 嵌套      更新时间:2023-10-16

我有一个大的软件框架,它目前生活在一个公共命名空间中。最近,我将一些类移到了嵌套的名称空间中,但是为了暂时保持向后兼容性,我需要将这些名称保留在全局名称空间中。到目前为止,我使用using:

namespace framework {
  namespace IO {
    struct IStream;
  }
#if COMPATIBILITY
using IO::IStream;
#endif 
}

然而,我同样可以很好地使用typedef IO::IStream IStream;

使用typedefusing相比有什么优缺点?

它们有些不同:typedef引入了一个新的类型名称framework::IStream,而using指令只影响它出现的作用域内的名称查找。(如果你定义一个单独的,真正的类型framework::IStream,这有额外的影响,但因为你没有这样做,这不是一个问题。)

在这个意义上,我想说using是一个实现细节,这比引入新类型名称所带来的全局语义变化更可取。因此,如果您可以摆脱它,请在需要的范围内使用using指令,并且您可以逐渐将它们迁移到新系统。