次のクラステンプレートがあるとします。
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(64ビット)のgccで試してみたところ、仮定が確認されました。
私の質問は:
- 私の仮定は、Visual C ++ 2008/2010/11(Windows)にとって妥当ですか?
- gcc 4. *(Linux)の場合?
- コンパイラフラグの任意の組み合わせについて?
- この仮定が当てはまらないコンパイラ/プラットフォームを知っていますか?
コンパイラは、たとえばデバッグ目的で、構造体にパディングを追加する可能性があると思います。しかし、実際にそれを行うコンパイラはありますか?
編集:あなたがここで尋ねたように、私は達成したいことです:
私は次の署名を持つメンバー関数を持っています:
Someclass* OtherClass::fn();
このように署名を変更したい:
Wrapper<Someclass> OtherClass::fn();
このラッパーは、スマートポインターのように機能します。つまり、ポインターの存続期間を考慮し、スコープ外になると解放します。関数はdllの境界を越えて呼び出されるので、戻り値(ダムポインターだけでなく、具体的なタイプになりました)がすべての状況(つまり、コンパイラー設定など)でポインターと同じサイズであることを確認したいと思います。だろう。計画/希望は、デバッグ/リリースアプリケーション/dllビルドのすべての組み合わせをサポートすることです。
あなたが尋ねるかもしれませんが:いいえ、私はブーストをdllユーザーに公開したくないので、boost :: shared_ptr <>、std :: shared_ptr <>、std ::unique_ptr<>などを使用することはできません。まだC++11をサポートしていません。