#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;
};