私は、一種の貧しい人のシングルトンとして機能する静的属性のみで構成されるクラスを持っています。その目的は、アプリケーションのさまざまなポイントから統計を収集することです。単体テストでは、実稼働コードとの違いを取得するために使用できるシャドウ コピーを作成しました。
例:
struct Production {
static ComplexClass value1;
static ComplexClass value2;
};
struct ProductionShadow {
static ComplexClass::ValueType value1;
static ComplexClass::ValueType value2;
};
すべてのメンバーは静的であるため、シャドウ クラスはプロダクション クラスから継承できず、プロダクション クラスの属性は副作用のある複雑なオブジェクトであり、比較のためにシャドウに単純な値のみを保持させたいと考えています。
シャドウ クラスの保守をいくらか容易にするために、静的アサートを追加して、誰かがプロダクション クラスに属性を追加するたびにシャドウ クラスも更新されることを確認したいと考えました。
属性が静的でない場合、これは次のようにすることで簡単に達成できたはずです。
enum { NumberOfProductionAttributes = sizeof(Production) / sizeof(ComplexClass),
NumberOfShadowAttributes = sizeof(ProductionShadow) / sizeof(ComplexClass::ValueType) };
STATIC_ASSERT(NumberOfProductionAttributes == NumberOfShadowAttributes);
クラスを非静的にする以外に、本番クラスを適切なシングルトンに変換する必要があるため、実行したくないのですが、現在の実装でこのチェックを実行できる方法はありますか?
実行時に、シャドウ内のすべての値を本番クラスで検証するメソッドがあります。新しい属性が追加されたときにメソッドも更新する必要があるため、検証された属性の数を数え、その量が属性の総数と異なるかどうかをアサートできるようにしたいと考えています。
例
bool ProductionShadow::verify() {
std::size_t numberOfVerified = 0;
#define VERIFY(x) do { \
++numberOfVerified; \
// Verification code goes here \
} while (0)
VERIFY(value1);
VERIFY(value2);
ASSERT(numberOfVerified == NumberOfShadowAttributes);
// Return result
}
私が使用できる GCC 拡張機能があれば、移植可能なものを好みますが、それは許容できる解決策になるかもしれません。