#pragma once

template <typename T>
class DefaultVariable
{
public:
	DefaultVariable(const T & value)
	{
		defaultValue = value;
	}
	DefaultVariable<T> & operator =(const T & value)
	{
		currentValue = value;
		is_default = currentValue == defaultValue;
		is_explicit = true;
		return *this;
	}
	operator const T &() const
	{
		return is_default ? defaultValue : currentValue;
	}
	bool isDefault() const
	{
		return is_default;
	}
	bool isExplicit() const
	{
		return is_explicit;
	}
private:
	T currentValue;
	T defaultValue;
	bool is_default = true;
	bool is_explicit = false;
};