我有一个仅由静态属性组成的类,充当一种穷人的单身人士。其目的是从应用程序的各个点收集统计信息。对于我们的单元测试,我创建了一个卷影副本,可用于获取生产代码之间的差异。
例子:
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 扩展,我可以使用这可能是一个可接受的解决方案,即使我更喜欢可移植的东西。