c ++

时间:2017-01-02 01:53:23

标签: c++ c++11 namespaces

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

// using my_any...

答案 1 :(得分:6)

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

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

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

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

答案 2 :(得分:0)

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

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

中导出any

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