C#-like properties in native C++?

后端 未结 11 1895
南笙
南笙 2020-11-29 04:46

In C# / .NET you can do something like this:

someThing.text = \"blah\";
String blah = someThing.text;

However, the above code does not actu

11条回答
  •  借酒劲吻你
    2020-11-29 05:32

    #include 
    #include 
    
    using namespace std;
    
    // ------------------------------------------------------------------
    
    #define PROPERTY_GET_SET(CLASS, NAME, TYPE) GetSetProperty NAME() { return GetSetProperty(this, &CLASS::get_##NAME, &CLASS::set_##NAME); }
    #define PROPERTY_GET(CLASS, NAME, TYPE)     GetProperty NAME()    { return GetProperty(this, &CLASS::get_##NAME); }
    #define PROPERTY_SET(CLASS, NAME, TYPE)     SetProperty NAME()    { return SetProperty(this, &CLASS::set_##NAME); }
    
    template 
    struct GetSetProperty {
        typedef TYPE (CLASS::*Getter_t)() const;
        typedef void (CLASS::*Setter_t)(TYPE);
        GetSetProperty(CLASS* instance, Getter_t getter, Setter_t setter) : m_instance(instance), m_getter(getter), m_setter(setter) {}
        operator TYPE() const { return (this->m_instance->*this->m_getter)(); }
        GetSetProperty& operator=(TYPE value) { (this->m_instance->*this->m_setter)(value); return *this; }
        CLASS* const   m_instance;
        const Getter_t m_getter;
        const Setter_t m_setter;
    };
    
    template 
    struct GetProperty {
        typedef TYPE (CLASS::*Getter_t)() const;
        GetProperty(CLASS* instance, Getter_t getter) : m_instance(instance), m_getter(getter) {}
        operator TYPE() const { return (this->m_instance->*this->m_getter)(); }
        CLASS* const   m_instance;
        const Getter_t m_getter;
    };
    
    template 
    struct SetProperty {
        typedef void (CLASS::*Setter_t)(TYPE);
        SetProperty(CLASS* instance, Setter_t setter) : m_instance(instance), m_setter(setter) {}
        SetProperty& operator=(TYPE value) { (this->m_instance->*this->m_setter)(value); return *this; }
        CLASS* const   m_instance;
        const Setter_t m_setter;
    };
    
    template 
    ostream& operator<<(ostream& ostr, const GetSetProperty& p) { ostr << (p.m_instance->*p.m_getter)(); return ostr; }
    
    template 
    ostream& operator<<(ostream& ostr, const GetProperty& p) { ostr << (p.m_instance->*p.m_getter)(); return ostr; }
    
    // ------------------------------------------------------------------
    
    class Dummy
    {
    public:
    
        Dummy() : m_value1(42) {}
    
        PROPERTY_GET_SET(Dummy, Value1, int);
        PROPERTY_GET_SET(Dummy, Value2, const string&);
    
    protected:
    
        virtual int           get_Value1() const { return this->m_value1; }
        virtual void          set_Value1(int value) { this->m_value1 = value; }
    
        virtual const string& get_Value2() const { return this->m_value2; }
        virtual void          set_Value2(const string& value) { this->m_value2 = value; }
    
    private:
    
        int    m_value1;
        string m_value2;
    };
    
    
    int main(int argc, char* argv[]) {
    
        Dummy d;
    
        cout << d.Value1() << endl;
        d.Value1() = 3;
        cout << d.Value1() << endl;
    
        cout << d.Value2() << endl;
        d.Value2() = "test";
        cout << d.Value2() << endl;
    
        return 0;
    }
    
    // ------------------------------------------------------------------
    

提交回复
热议问题