簡體   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