目前,我們在圖書館工作,被允許在可能時使用C++ 11月14日的特性和類型,但必須以其他方式退回到一個C++ 03的實現模板。鼓勵該庫的用戶和開發人員使用名稱空間std
中的類型和模板。使用從由未與所使用的編譯器運C++標準的較新版本中引入的命名空間std
類型時出現擴展空間std與回遷類型和新的C++標準
問題。一種建議的選擇是爲某些不依賴於新語言特徵的類型提供'backports'作爲我們的庫代碼的一部分,例如std
。 Fixed 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
?
你可以引入一個新的命名空間'mystd',其中包含所有你喜歡的新功能,並且'使用命名空間標準;'和代碼中你想使用命名空間'std'的任何地方,只需使用'mystd'。 – alexeykuzmin0
*未定義的行爲*表示程序的行爲未定義。它可能工作得很好,它可能會產生一個編譯器錯誤,它可能有一個微妙的錯誤,只有0.01%的時間。這意味着我們失去了推理代碼在任何符合標準的編譯器上做什麼的能力。 – NathanOliver
我認爲你應該使用Boost庫。其中大部分已經在那裏解決了。如果你想堅持自己做,就像Boost那樣做,這就像你在第三點所做的一樣:是的,那樣做。 – Rene