C++ c+中的名称空间别名+;

C++ c+中的名称空间别名+;,c++,c++11,namespaces,C++,C++11,Namespaces,我使用c++11,而我需要c++17库中的一些类。使用添加了哪些类的boost时,我希望执行以下操作: #if __cplusplus < CPP17 using std::any = boost::any; #endif \if\u cplusplus

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

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

不允许使用此别名。扩展std名称空间也会导致。我希望我的代码看起来像C++版本中的相同。有明确的方法吗?

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

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

// using my_any...
\if\u cplusplus
您似乎正在尝试在命名空间中创建类型别名。其corect语法为:

namespace namespace_name {
    using any = boost::any;
}
但是,标准不允许在
std
名称空间中添加定义(模板专门化也有例外),因此如果您试图定义
std::any
,程序的行为将是未定义的


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

我认为未定义的行为没有什么大不了的。您已经使用了一个#if来检查C++17,并且您知道在此之前没有任何
any
。如果你真的想这样做,我建议你去做,如果别名早于C++17,就把它放在std中

最终,helper函数/类/etc可能会被放置在另一个名称空间中,或者以_u作为前缀,因为标准库可以使用它。我认为任何C++17之前版本的实现都不会在std中导出
any


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

只要使用您自己的名字,并根据需要为其指定
boost::any
std::any
?我希望使用std::any以实现c++17兼容性。@Ariel如您所知,不可能“修改”std名称空间合法。我试图在std名称空间中添加定义,它被编译。@Ariel我已经修改了我的答案。
std
中的定义不会使程序格式错误,它会使行为未定义。也就是说,不合格的程序不能保证程序不被编译。很遗憾,当我从旧的C++版本切换到新的版本时,我必须改变“STD”中的所有“Boost”。@ Ariel,可以使用预处理器宏创建一个TyBufff,用于Boost,还是标准取决于标准版本。@Ariel看来宋元耀的答案已经有了一个例子。