    namespace detail
    {
        template<typename T>
        struct dummy
        {
            T get() const { return T(); }
            void set(T) { }
        };
    }

    #include <type_traits>

    // Simple Property
    template<typename Value,
             typename ValueOwner = detail::dummy<Value>,
             Value (ValueOwner::*Getter)(void) const = &ValueOwner::get,
             void (ValueOwner::*Setter)(Value) = &ValueOwner::set,
             bool = std::is_same<ValueOwner, detail::dummy<Value>>::value
             >
    class Property {
        public:

            Value get() const { return m_value; }

            void set(Value value) { m_value = value; }

        private:

            Value m_value;
    };

    // Complicated Property
    template<
        typename Value,
        typename ValueOwner,
        Value (ValueOwner::*Getter)(void) const,
        void (ValueOwner::*Setter)(Value)
    >
    class Property<Value, ValueOwner, Getter, Setter, false>
    {
      // Stuff for calling the getter & setter
    };

    struct MyClass
    {
        int get() const { return 42; }
        void set(int) { }
    };

    int main()
    {
        Property<int> simpleProperty;
        simpleProperty.get();

        Property<int, MyClass, &MyClass::get, &MyClass::set> complicatedProperty;
    }
