假設我有下面的類模板:含1指針struct的大小
template<typename T>
struct Wrapper {
T* t_;
static void check() {
static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
}
};
我在C99標準看一個在C++ 03標準,並不能找到一個擔保我的假設在表達static_assert
。我用Visual C++ 2008和2010(32位)和linux上的gcc(64位)使用了幾個編譯器選項嘗試了它,並發現我的假設得到了確認。
我的問題是:
- 是我的假設合理的Visual C++ 2008/2010/11(窗口)?
- 對於gcc 4. *(linux)?
- 對於編譯器標誌的任何組合?
- 你知道任何編譯器/平臺的這種假設不適用嗎?
我想編譯器可能會添加一些填充到結構,例如用於調試目的。但是有沒有一個編譯器可以實現這個功能?
編輯:所以,當你問這裏是我想達到的目標:
我有以下簽名的成員函數:
Someclass* OtherClass::fn();
我想改變簽名是這樣的:
Wrapper<Someclass> OtherClass::fn();
這個包裝就像一些智能指針,它關心指針的生命週期,因此它在超出範圍時釋放它。由於該函數是通過dll邊界調用的,因此我想確保返回的值(現在是具體類型,而不僅僅是啞指針)在所有情況下(即編譯器設置等)與指針具有相同大小將會。該計劃/希望是支持調試/發佈應用程序/ dll構建的所有組合。
正如你可能會問:不,我不能使用boost :: shared_ptr <>,std :: shared_ptr <>,std :: unique_ptr <>之類的,因爲我們不想暴露對dll用戶的提升而我們目前還不支持C++ 11。
您是否考慮過虛函數/繼承? – PlasmaHH
所以...你希望我們在所有這些編譯器和平臺上爲你測試代碼嗎? –
不,他可能想知道某人是否已經做了類似的事情,或者如果這是隱含在標準或編譯器文檔的其他地方。 – Tibor