#include <functional>

template<typename T>
class ValueWrapper {
public:
    ValueWrapper(T value, std::function<void(const T&)> setCallback, std::function<T()> getCallback)
        : m_value(value), m_setCallback(setCallback), m_getCallback(getCallback) {}

    void set(const T& value) {
        m_value = value;
        if (m_setCallback) {
            m_setCallback(m_value);
        }
    }

    T get() const {
        if (m_getCallback) {
            return m_getCallback();
        }
        return m_value;
    }

private:
    T m_value;
    std::function<void(const T&)> m_setCallback;
    std::function<T()> m_getCallback;
};

// Usage example:
int main() {
    int myInt = 42;
    ValueWrapper<int> intWrapper(myInt,
        [](const int& value) {
            // Set callback function
            // Do something with the new value
            // e.g., update a variable, trigger an event, etc.
            // ...
        },
        [&myInt]() {
            // Get callback function
            // Return the current value
            return myInt;
        });

    // Set the value using the wrapper
    intWrapper.set(100);

    // Get the value using the wrapper
    int value = intWrapper.get();

    return 0;
}
