加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 获取类中静态属性的数量

发布时间:2020-12-16 07:30:06 所属栏目:百科 来源:网络整理
导读:我有一个由静态属性组成的类,作为一个穷人的单身人士.其目的是从应用程序的各个点收集统计数据.对于我们的单元测试,我创建了一个阴影副本,可用于获取生产代码中的一个. 例: struct Production { static ComplexClass value1; static ComplexClass value2;};
我有一个由静态属性组成的类,作为一个穷人的单身人士.其目的是从应用程序的各个点收集统计数据.对于我们的单元测试,我创建了一个阴影副本,可用于获取生产代码中的一个.

例:

struct Production {
    static ComplexClass value1;
    static ComplexClass value2;
};

struct ProductionShadow {
    static ComplexClass::ValueType value1;
    static ComplexClass::ValueType value2;
};

由于所有成员都是静态的,因此shadow类不能从生产类继承,并且生产类中的属性是具有副作用的复杂对象,我只希望阴影保存简单值以进行比较.

为了使影子类更容易维护,我想添加一个静态断言来检查每当有人向生产类添加属性时,影子类也会更新.

如果属性不是静态的,可以通过执行以下操作轻松完成:

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扩展我可以使用,这可能是一个可接受的解决方案,即使我更喜欢便携式的东西.

解决方法

以防万一,这是我在问题评论中建议的解决方案.我们的想法是以非静态成员的形式创建两个包含相关数据成员的类:

struct ProductionStaticMembers
{
  ComplexClass value1;
  ComplexClass value2;
};

struct ProductionShadowStaticMembers
{
  ComplexClass::ValueType value1;
  ComplexClass::ValueType value2;
};

然后重新定义原始类以包含上面定义的类作为静态成员.它们将继续像以前一样运行,并且可以针对上面定义的类型执行大小检查.

struct Production {
  static ProductionStaticMembers static_members;
};

struct ProductionShadow {
  static ProductionShadowStaticMembers static_members;
};

不可否认,这意味着改变静态成员的访问方式(因为他们现在是另一个成员的成员);因此,可能需要对现有代码进行许多更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读