Referenz auf (Template)Behälterklasse



  • Hallo,
    ich habe folgendes Problem:

    Ich habe zwei Klassen. Zum einen wäre da eine Schnittstellenklasse, zum anderen eine Behälterklasse, die diejenigen Klassen, die von der Schnittstellenklasse abgeleitet sind, verwaltet.
    Das ganze wird an folgendem Beispiel vereinfacht dargestellt.

    #include <iostream>
    #include <memory>
    #include <vector>
    
    class Bar;
    
    class IFoo
    {
    public:
    	IFoo(Bar& bar)
    		: bar_{ bar }
    	{}
    
    	virtual void Foo() = 0;
    
    protected:
    	Bar& bar_;
    };
    
    class Bar
    {
    public:
    	template<typename Foo>
    	void RegisterFoo()
    	{
    		foos.emplace_back(std::make_unique<Foo>(*this));
    	}
    
    	std::vector<std::unique_ptr<IFoo>> foos;
    };
    
    class FooOne final
    	: public IFoo
    {
    public:
    	FooOne(Bar& bar)
    		: IFoo(bar)
    	{}
    
    	void Foo() override
    	{
    		std::cout << "FooOne\n";
    	}
    };
    

    Da mir alle abgeleiteten Klassen zur Übersetzungszeit bekannt sind, dachte ich mir man könnte das ganze vereinfachen,
    indem man der Behälterklasse (in diesem Fall "Bar") einfach eine Liste aller Typen der Unterklassen übergibt und diese sich selbst um die "Registrierung" kümmert. Wiederum folgt ein Beispiel.

    #include <iostream>
    #include <tuple>
    
    template<typename... Foos>
    class Bar;
    
    class IFoo
    {
    public:
    	virtual void Foo() = 0;
    };
    
    template<typename... Foos>
    class Bar
    {
    public:
    	template<typename Foo>
    	auto Get() noexcept
    	{
    		return std::get<Foo>(foos_);
    	}
    private:
    	std::tuple<Foos...> foos_;
    };
    
    class FooOne final
    	: public IFoo
    {
    public:
    	void Foo() override
    	{
    		std::cout << "FooOne!\n";
    	}
    };
    

    Jetzt zum eigentlichen Problem. Wie kann ich den abgeleiteten Klassen im zweiten Beispiel eine Referenz bzw. einen Zeiger auf die Behälterklasse übergeben?
    Da diese, falls ich mich nicht irre, den Typ der Behälterklasse kennen müssen, fällt diese Aufgabe schwerer aus als sie zu sein scheint.



  • du überlädst den konstruktor bzw. arbeitest mit templates und dann kannst du die referenz doch übergeben.


Log in to reply