私は1つの解決策を与えることができます。
しかし:
その労力は、おそらく手作業でチェックするよりもはるかに大きいでしょう。プログラマー向けのほとんどすべての優れた IDE では、特定の変数へのすべての参照を表示できます。
これはおそらくすべての場合に機能するとは限りません。いくつかのタイプに特化する必要があります。
これは、1 回のプログラム実行で収集されます。
アイデアは、データ型をラップすることです。このようなカプセル化により、すべての読み取り操作をカウントできます。見る:
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()
。このデータを外部ファイルに収集できます。