2016-12-16 58 views
2

目前,我們在圖書館工作,被允許在可能時使用C++ 11月14日的特性和類型,但必須以其他方式退回到一個C++ 03的實現模板。鼓勵該庫的用戶和開發人員使用名稱空間std中的類型和模板。使用從由未與所使用的編譯器運C++標準的較新版本中引入的命名空間std類型時出現擴展空間std與回遷類型和新的C++標準

問題。一種建議的選擇是爲某些不依賴於新語言特徵的類型提供'backports'作爲我們的庫代碼的一部分,例如stdFixed width integer types

//file: std_backport.h 

namespace std_backport { 
    typedef char int8_t; //for platforms where 'char' is 8 bit 
    typedef short int16_t; //for platforms where 'short' is 16 bit 
    //[and so on] 
} 

//enter 'sacred' territory and introduce the types to namespace std 
namespace std { 
    using namespace ::std_backport; 
} 

另一個例子是其通過VS2010在技術報告中提供的tuple類型:

//file std_tuple_backport.h 
#include <tr1/tuple>    //std::tr1::tuple 

namespace std { 
    using ::std::tr1::tuple; 
} 

當然我們必須提供檢查以啓用/禁用根據這些文件的包容到所使用的編譯器。

我做了這件事,知道的事實了一些研究,認爲extending the namespace std像這是不確定的行爲,我想放棄了這個想法。但是,我遇到了#this answer其中#4:

將任何東西放在std命名空間是一個「未定義的行爲」。這意味着規範沒有說明會發生什麼。但是如果你知道在特定平臺上標準庫沒有定義某些東西,那就繼續定義它。 [...]

所以我的問題是:

  • 可以請人澄清對我究竟是「不確定的行爲」在這種情況下,是什麼意思?
  • 正在提供這樣的認爲是「壞習慣」,即使我們只是提供類型從一個較新的標準C++ 11月14日的兼容性?
  • 什麼是替代方案或甚至更好的方式來實現這種代碼兼容性,而無需定義從名稱空間std在自己的命名空間中的所有內容,並使用它而不是命名空間std
+0

你可以引入一個新的命名空間'mystd',其中包含所有你喜歡的新功能,並且'使用命名空間標準;'和代碼中你想使用命名空間'std'的任何地方,只需使用'mystd'。 – alexeykuzmin0

+0

*未定義的行爲*表示程序的行爲未定義。它可能工作得很好,它可能會產生一個編譯器錯誤,它可能有一個微妙的錯誤,只有0.01%的時間。這意味着我們失去了推理代碼在任何符合標準的編譯器上做什麼的能力。 – NathanOliver

+1

我認爲你應該使用Boost庫。其中大部分已經在那裏解決了。如果你想堅持自己做,就像Boost那樣做,這就像你在第三點所做的一樣:是的,那樣做。 – Rene

回答

1

可以請某人澄清在這種情況下,'未定義的行爲'究竟意味着什麼?

同任何其他情況。該標準不保證任何行爲。

該程序可能無法編譯,成功編譯但崩潰,不會崩潰,並具有預期的輸出或意外的輸出,取決於任何變量,如編譯器,CPU架構或月相。就標準而言。

即使我們只是提供新標準的類型,是否提供了像這種被認爲是「不良做法」的C++ 11/14兼容性?

如果我關心程序的標準合規性 - 而且我經常這麼做,那麼我認爲這是一種不好的做法。

什麼是替代,甚至更好的方式來實現這種代碼的兼容性,而不必在自己的命名空間來定義一切從空間std和使用,而不是空間std的?

你不需要定義所有東西從std。只需在另一個namesace中定義缺少的功能(或使用第三方實現),並使用std命名空間中的現有功能。