Написал тут небольшой шаблонный класс, позволяющий отслеживать использование неинициализованных переменных. Основной use case — проверка того, что все явно созданные переменные имеют контролируемые значения, т.е. исключается, что они получили какие-то значения по-умолчанию. Может быть полезен при отладке. Вот текст. Ругайте
#include <iostream>
#include <stdexcept>
using namespace std;
template <typename T>
class Variable
{
private:
bool is_initialized;
T value;
public:
Variable()
:is_initialized(false) {};
Variable(const Variable& rhs)
{
if(rhs.is_initialized)
{
is_initialized = true;
value = rhs.value; // call copy constructor of T class
}
else
is_initialized = false;
};
Variable& operator=(const Variable& rhs)
{
if(rhs.is_initialized)
{
is_initialized = true;
value = rhs.value; // call T.operator=() or T(const T& rhs)
}
else
is_initialized = false;
return *this;
};
Variable(const T& rhs) // create Variable<T> object from T
:is_initialized(true), value(rhs) {};
operator T() // Type conversion to use Variable<T> instead of T everywhere
{
if(is_initialized)
return value;
else
throw invalid_argument("Variable is unbound");
};
};
int
main(void)
{
double p = 0.1;
Variable<double> q; // Create unbound variable
Variable<double> r = 0.0; // Create bound variable with appropriate value
// can assign
r = p;
cout << r << endl;
double s = 2*r;
cout << s << endl;
// using unbound variable causes error
cout << p*q << endl;
return 0;
}