我可以给出一个解决方案。
但:
这种努力可能比手动检查要大得多。几乎所有适合程序员的优秀 IDE 都允许您查看对给定变量的所有引用。
这可能不适用于每种情况,您需要专门针对某些类型。
这将由单个程序运行收集。
这个想法是包装你的数据类型。通过这样的封装,您可以计算每个读取操作。看:
template <class T, class Parent, int NO=1>
class TReadDetector {
public:
struct Data {
bool touched;
Data () : touched(false) {}
~Data () {
if (!touched)
std::cerr << typeid(*this).name() << ": not read!!!\n" << std::endl;
}
};
static Data data;
TReadDetector () {}
TReadDetector (const T& t) : t(t) {}
operator T () const { data.touched = true; return t; }
TReadDetector& operator = (const T& t) { this->t = t; }
private:
T t;
};
template <class T, class Parent, int NO>
typename TReadDetector<T,Parent,NO>::Data
TReadDetector<T,Parent,NO>::data;
和用法:
代替:
struct A {
int a;
int b;
};
做这个:
struct A {
TReadDetector<int,A, 1> a;
TReadDetector<int,A, 2> b;
};
int main() {
A a;
a.a = 7;
a.b = 8;
std::cout << a.a << std::endl;
std::cout << TReadDetector<int,A, 1>::data.touched << std::endl;
std::cout << TReadDetector<int,A, 2>::data.touched << std::endl;
std::cout << "main() ended" << std::endl;
};
这将导致:
7
1
0
main() ended
N13TReadDetectorIi1ALi2EE4DataE: not read!!!
注意在 . 之后打印的最后一行main()
。您可以将此数据收集到一些外部文件。