2017-06-15 211 views
1

我通常使用boost來實現一些功能,特別是boost :: filesystem(1.58.0)。從boost到std :: experimental以及C++ 17

此外我使用std :: experimental到string_view(我的編譯器沒有將它作爲標準包含在內 - g ++ 5.4.0 20160609)。

因爲我使用的提升功能是apropoved我想準備C++ 17。

Fortunaly我用我的代碼如下命令:

using namespace boost::filesystem; //the only exeption is to boost::filesystem::remove 

using namespace std::experimental; 

如果我更換增長線,以「using namespace std::experimental::filesystem;」我會得到完全相同的行爲與變化罷了在我的代碼實現提升?

後,我得到了官方的gcc編譯器使用這些功能已經包括作爲標準所有我需要做的是: 一)改變「std::experimental::filesystem;」到「std::filesystem」 B)刪掉就行了「using namespace std::experimental;

並獲得相同的行爲與更改沒有更多的在我的代碼?

C++ 17中包含哪些其他增強功能,也可以像上面描述的那樣輕鬆替換?

+0

雖然一些新功能基於Boost庫或受Boost庫啓發,但Boost庫可能沒有一對一翻譯到標準庫中。有了這個說法,我懷疑會有什麼大的或常見的變化(如果有的話),所以你應該能夠像Boost文件系統庫一樣使用'std :: filesystem'。 –

+2

Boost文件系統和Boost線程是我知道的唯一嘗試跟蹤標準提議的兩個線程。這會立即反映在它們在公共接口中有許多重大更改(Boost Filesystem v2/v3,並且Boost Thread使用了十幾個重要的有條件編譯的功能選擇宏) – sehe

回答

4

Boost不是(隸屬於)ISO標準。

不,你不應該盲目地期望語義是相同的。即使在80%-90%的情況下,界面將是兼容的,你將會得到不同。

E.g.允許使用boost::optional<T&>,但不能使用標準版本。還有其他的區別。

一般來說,使用using-directives是一個不好的做法,特別是如果您使用它來描述這些差異。如果你想保持你的依賴移動,最好創建你自己的命名空間,包裝函數。

在我的代碼庫中,例如我已經使用

namespace XXX { 

    using nullopt_t = ::boost::none_t; 
    static CONSTEXPR nullopt_t nullopt = {}; 

    template <typename T> using optional = ::boost::optional<T>; 
} 

我們使用這個接口專門任何非升壓特定的代碼。

這應該有助於轉換到標準庫版本,除了已經列出的語義差異。

+0

我明白爲什麼使用using指令與外部庫像boost我也讀過它不好使用std「using namespace std;」我不明白爲什麼。 – Tecoberg

+3

顯然這是一個選擇。頭文件中的使用指令很少是一件好事,因爲它會引起名稱衝突並可能巧妙地引入錯誤,例如, ADL。 (值得注意的例外是內聯命名空間和版本控制,我猜)。見例如[爲什麼使用命名空間std認爲不好的做法](https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) – sehe

+0

在這種情況下,我激勵_why_它不是切換實現的可靠方法:規範不可互換。 – sehe

1

Boost和後來的派生標準往往有所不同。

在文件系統的情況下,有一些重大變化。在我頭頂上,一面旗幟變成了一塊旗幟。

但是,90%的代碼工作原理相同。

相反的using namespace boost::filesystem;,可以考慮使用

#ifdef USE_BOOST_FILESYSTEM 
    namespace filesystem = boost::filesystem; 
#else 
    namespace filesystem = std::experitmental::filesystem; 
#endif 

現在使用filesystem::前綴您對API的使用。

在實現不同的少數幾個點上,您可以使用更多#ifdef

該名稱空間中的事物現在伸出您的代碼中,並且您有一個#ifdef來處理它們不兼容的角落案例。

相關問題