繁体   English   中英

c ++中的命名空间别名

[英]Namespace alias in c++

我使用c ++ 11,而我需要一些来自c ++ 17库的类。 当使用添加类的boost时,我希望执行以下操作:

#if __cplusplus < CPP17
using std::any = boost::any;  
#endif

不允许使用此类别名。 同时扩展std命名空间会导致未定义的行为 我希望我的代码看起来与c ++版本相同。 有明确的方法吗?

明确的方法是为其添加自定义名称。

#if __cplusplus < CPP17
using my_any = boost::any;
#else
using my_any = std::any;    
#endif

// using my_any...

您似乎正在尝试在命名空间中创建类型别名。 核心语法是:

namespace namespace_name {
    using any = boost::any;
}

但是,标准不允许将定义(模板特化的例外)添加到std命名空间中,因此如果您尝试定义std::any ,则程序的行为将是未定义的。

使用任何命名空间(包括全局命名空间)都可以,但不是保留给实现的命名空间,包括std及其子命名空间。

我没有看到与未定义的行为担忧有关的大问题。 你使用#if来检查C ++ 17,你知道之前没有any 如果你真的想要这个,我说去吧,如果它早于C ++ 17,则将别名放在std中。

在一天结束时,辅助函数/类/等可能会放在另一个命名空间中或以__为前缀,因为它可用于标准库。 我不认为pre-C ++ 17的任何实现any在std中导出。

别无他法。 只要忽略“未定义的行为”,如果它有效,就去做吧。 破坏你的代码并没有什么神奇之处; 最糟糕的情况是,当您定义别名时,错误的std实现会发生冲突并且无法编译。 在我看来,有些人过度夸大了未定义的行为问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM