C++ 强制处理类中的所有成员变量

C++ 强制处理类中的所有成员变量,c++,class,handle,member,C++,Class,Handle,Member,有没有一个概念可以确保在实现者忘记扩展应该处理所有成员的方法时,向现有类添加成员会产生某种错误/警告 如果一个类实现了几个必须接触所有元素的方法(例如导入/导出),那么很容易忘记一个或多个要适应的方法。编译器不会识别它,并且在很多情况下,其行为都会如预期的那样(当然,除非您有正确的测试) 我目前的尝试是在每个方法中测试类的大小,这些方法可能会被悄悄地遗忘。但是,这当然不容易阅读,不安全,而且与编译器/平台/构建类型无关(所以我不喜欢它) C类 { int元素1; int元素2; int ele

有没有一个概念可以确保在实现者忘记扩展应该处理所有成员的方法时,向现有类添加成员会产生某种错误/警告

如果一个类实现了几个必须接触所有元素的方法(例如导入/导出),那么很容易忘记一个或多个要适应的方法。编译器不会识别它,并且在很多情况下,其行为都会如预期的那样(当然,除非您有正确的测试)

我目前的尝试是在每个方法中测试类的大小,这些方法可能会被悄悄地遗忘。但是,这当然不容易阅读,不安全,而且与编译器/平台/构建类型无关(所以我不喜欢它)

C类
{ 
int元素1;
int元素2;

int element3;在这种情况下,我使用了python脚本+clang库。 Python脚本通过解析生成导入、导出等方法
类定义。

这只是一个想法,不是解决方案

将所有成员打包到一个元组中。编写一些模板元编程代码,将给定函数应用于元组的每个成员。在每个方法中使用该模板元函数,该方法必须遍历所有成员,并使其应用于该方法的特定函数

mpl可能是一个起点

但请注意:这并不容易,这是一项先进的技术。根据您的经验,您的里程数可能会有所不同

有没有一个概念可以确保在实现者忘记扩展应该处理所有成员的方法时,向现有类添加成员会产生某种错误/警告

是:测试驱动设计。也就是说,在更改代码之前,添加检查新成员分配的测试。然后,运行测试(它们应该失败)。然后,修复实现


不幸的是,这是一个依赖于开发人员的注意力,所以只有当你把它变成习惯时才有用:(< /P>代码> StistaSypRe>/Cuff>……并且不要假定数据类型的大小总是你所期望的。最好使用<代码> sieZof(int)*3 < /Cord>。但是你不应该忘记在C++中实现东西。有了适当的单元测试,您所需要做的就是将它添加到
操作符==
,然后一些测试将失败,直到所有方法都完成。如果导入/导出仍然需要支持类的旧版本,那么可能会稍微复杂一些……我非常喜欢TDD,但我看不出这种方法对我有什么帮助。想象一个toStr()方法,即使他为他想到的所有功能编写测试,他也可能错过一个用例。
class C
{ 
    int element1;
    int element2;
    int element3;   <--- newly added without adapting operator==()

public:

    void import_me();
    void export_me();
    bool operator== (const C&);
    void dump();
};
void C::import_me(){
    assert( sizeof( *this ) == 12 ); // this is my attempt of doing this

    read_fn( element1 );
    read_fn( element2 );
    read_fn( element3 );
}

void C::export_me(){
    assert( sizeof( *this ) == 12 ); // this is my attempt of doing this

    write_fn( element1 );
    write_fn( element2 );
    write_fn( element3 );
}

/// the implementer forgot to adapt this method
bool C::operator==(const C &other) {

    assert( sizeof( *this ) == 8 );             <--- this would fail

    if( element1 != other.element1 ) return false;
    if( element2 != other.element2 ) return false;
    return true;
}