私はstatic_assert
(および標準化前のバリアントを)かなり頻繁に使用してきました。私たちの多くが使用していると確信している用途の 1 つは、機密データ構造のサイズがプラットフォームや構成全体で想定どおりに維持されるようにすることです。例えば:
class SizeSensitiveClass
{
// ...
};
static_assert (sizeof(SizeSensitiveClass) == 18, "Check the size!");
ここで、この特定の用途に役立つ便利なマクロを作成しました。
#define STATIC_ASSERT_SIZE(T, sz) (sizeof(T) == (sz), "Size of '" #T "' doesn't match the expected value.")
次のように使用します。
STATIC_ASSERT_SIZE (SizeSensitiveClass, 18);
この出力を生成するもの:(コンパイル時に、明らかにコンパイルエラーの形で)
「SizeSensitiveClass」のサイズが期待値と一致しません。
これは問題ありませんが、このマクロの実装を (インターフェイスをそのまま維持して) 拡張して、データ構造の現在のサイズと予想されるサイズも出力できるかどうか疑問に思っていました。理想的には、出力は次のようになります。
「SizeSensitiveClass」のサイズが期待値と一致しません (20 対 18)。
今のサイズでも非常に便利です。これは可能ですか?
VC12 (Visual C++ 2013) と GCC 4.8.1 を使用しています。少なくともこれら2つに移植できるソリューション/テクニック/方法をいただければ幸いです。
私は一般的な「文字列化」トリックを試しましたが、うまくいきませんでした (期待していたように) sizeof(T)
、出力にリテラル文字列が生成されるだけです。
これが s (メッセージ文字列を生成するため)を使用して実装される可能性があるという漠然とした考えがありますconstexpr
が、私はそれらに慣れていません。