Wie funktionieren Proxy-Objekte?



  • Hallo,

    std::vector<int> buffer = Klasse.construct<std::vector<int>>(/* blabla */)(/* blabla */);
    

    wie müsste die Klasse dafür aussehen?



  • Was hat das mit Proxy Objekten zu tun?
    Was soll die zweite (/* blabla */)?

    class aKlasse{
    public:
    	template<typename T>
    	T construct(){
    		return T();
    	}
    };
    




  • Nö, die Klasse dafür müsste eher so aussehen:

    template <class T>
    class CtorProxy
    {
    public:
        T operator () ()
        {
            return T();
        }
    };
    
    class CtorProxyFactory
    {
    public:
        template <class T>
        CtorProxy<T> construct()
        {
            return CtorProxy<T>();
        }
    };
    


  • Ehm ok, im Eifer der Nacht habe ich mich wohl falsch ausgedrückt. Ohne noch mehr Worte zu verlieren:

    #include <boost/interprocess/managed_shared_memory.hpp> 
    #include <iostream> 
    
    int main() 
    { 
      boost::interprocess::shared_memory_object::remove("Highscore"); 
      boost::interprocess::managed_shared_memory managed_shm(boost::interprocess::open_or_create, "Highscore", 1024); 
      int *i = managed_shm.construct<int>("Integer")(99); 
      std::cout << *i << std::endl; 
      std::pair<int*, std::size_t> p = managed_shm.find<int>("Integer"); 
      if (p.first) 
        std::cout << *p.first << std::endl; 
    }
    

    managed_shm.find<int>("Integer"); sucht ja im Speicher und gibt irgendwas zurück (keine Ahnung was, soweit habe ich noch nicht gelesen). Also, wie müsste hier boost::interprocess::managed_shared__memory::find aussehen? (Finde die Doku sehr verwirrend).



  • Du meinst das aneinanderhängen via operator(). Das ist ziemlich simpel:

    Class Blah {
    public:
       Blah& operator() (Whatever we) 
       {
          // Tue was sinnvolles
          return *this;
       }
    
       // Ist im Grunde auch nichts anderes als
       Blah& DoSomething (Whatever we)
       {
          // ...
          return *this
       }
       // Könnte man jetzt auch einfach aneinanderhängen:
       // blah.DoSomething(x).DoSomething(y).DoSomething(z);
    }
    


  • Nein, aber trotzdem Danke.



  • naja, ziemlich genau so wie ich geschrieben habe.

    struct ManagebObjectBase
    {
        explicit ManagebObjectBase(char const* name) : m_name(name) {}
        virtual ~ManagebObjectBase() {}
    
        std::string const m_name; // müsste man hier nicht nochmal ablegen, wenn man ne std::map verwendet, aber das nochmal zu ändern ist mir jetzt zu doof
    };
    
    template <class T>
    struct ManagebObject : ManagebObjectBase
    {
        explicit ManagebObject(char const* name) :
            ManagebObjectBase(name),
            m_object() {}
    
        explicit ManagebObject(char const* name, T const& t) :
            ManagebObjectBase(name),
            m_object(t) {}
    
        template <class A1>
        ManagebObject(char const* name, A1 const& a1) :
            ManagebObjectBase(name),
            m_object(a1) {}
    
        template <class A1, class A2>
        ManagebObject(char const* name, A1 const& a1, A2 const& a2) 
            ManagebObjectBase(name),
            m_object(a1, a2) {}
    
        // ...
    
        T m_object;
    };
    
    std::map<std::string, ManagedObjectBase*> g_objects;
    
    template <class T>
    class CtorProxy
    {
    public:
        explicit CtorProxy(char const* name) : m_name(name) {}
    
        T* operator () ()
        {
            // vorher sollte man natürlich nochmal checken ob es nicht schon ein objekt mit dem namen gibt,
            // genauso fehlt natürlich das ganze "interprocess" zeugs, aber darum
            // geht's ja hier nicht wenn ich das richtig verstanden habe
            ManagedObject<T>* o = new ManagedObject<T>(m_name.c_str());
            g_objects.insert(std::make_pair(m_name, o));
            return &o.m_object;
        }
    
        T* operator () (T const& t)
        {
            ManagedObject<T>* o = new ManagedObject<T>(m_name.c_str(), t);
            g_objects.insert(std::make_pair(m_name, o));
            return &o.m_object;
        }
    
        template <class A1>
        T* operator () (A1 const& a1)
        {
            ManagedObject<T>* o = new ManagedObject<T>(m_name.c_str(), a1);
            g_objects.insert(std::make_pair(m_name, o));
            return &o.m_object;
        }
    
        template <class A1, class A2>
        T* operator () (A1 const& a1, A2 const& a2)
        {
            ManagedObject<T>* o = new ManagedObject<T>(m_name.c_str(), a1, a2);
            g_objects.insert(std::make_pair(m_name, o));
            return &o.m_object;
        }
    
        // ...
    
    private:
        std::string const m_name;
    };
    
    class CtorProxyFactory
    {
    public:
        template <class T>
        CtorProxy<T> construct(char const* name)
        {
            return CtorProxy<T>(name);
        }
    };
    

    wie find() aussehen müsste sollte jetzt denke ich klar sein.



  • Wie lang muss man eigentlich C++ programmieren, bis man sowas macht?



  • mkllt schrieb:

    Wie lang muss man eigentlich C++ programmieren, bis man sowas macht?

    Sollte das jetzt ne Provokation sein? 😞


Anmelden zum Antworten