Вот, достало ловить ошибки с неинициализованными членами больших классов, вида
class MyBigClass
{
int m_mySmallValue;
...
MyBigClass();
MyBigClass(X x, Y y, Z z);
... и еще куча конструкторов
};
MyBigClass::MyBigClass(xxxx) : ......
// а про малюсенькое данное забыли :(
{
}
Поэтому сделал шаблон самоинициализирующихся значений простых типов (числа, указатели).
template< class T, T i = 0 >
class auto_value
{
T t_;
public:
typedef T data_t;
typedef auto_value& self_t;
// конструктор по умолчанию - главное достоинство этой тулзы
inline auto_value() : t_(i) {}
// конструктор с 1 параметром (в том числе - конструктор копирования)
template< class V >
inline auto_value(V v) : t_(v) {}
// доступ к данному
inline const T& data() const { return t_; }
inline T& data() { return t_; }
// считается, что исходный тип - простой
inline operator T () const { return t_; }
inline operator T& () { return t_; }
// операторы присваивания
template< class V > inline self_t operator = (V v) { t_ = v; return *this; }
template< class V > inline self_t operator += (V v) { t_ += v; return *this; }
template< class V > inline self_t operator -= (V v) { t_ -= v; return *this; }
template< class V > inline self_t operator *= (V v) { t_ *= v; return *this; }
template< class V > inline self_t operator /= (V v) { t_ /= v; return *this; }
template< class V > inline self_t operator %= (V v) { t_ %= v; return *this; }
template< class V > inline self_t operator &= (V v) { t_ &= v; return *this; }
template< class V > inline self_t operator |= (V v) { t_ |= v; return *this; }
template< class V > inline self_t operator ^= (V v) { t_ ^= v; return *this; }
template< class V > inline self_t operator <<= (V v) { t_ <<= v; return *this; }
template< class V > inline self_t operator >>= (V v) { t_ >>= v; return *this; }
};
Такая куча операторов ??= нужна, чтобы не писать постоянно "myvalue.data() ??= 123"
Пример использования:
class MyBigClass
{
auto_value<bool /* , false */ > m_bEnabled;
...
public:
MyBigClass() {} // все члены инициализируются сами - как сумеют
...
bool isEnabled() { return m_bEnabled; } // получим false, а не 0xCDCDCDCD
void setEnabled(bool b) { m_bEnabled = b; }
...
};