Template-Parameter als String mitgeben



  • Hi, hier meine Problemstellung:
    Über Klasse A werden Operationen entgegengenommen, Klasse B hat einen template Parameter und dient der eigentlichen Bewältigung von Operationen.
    Über einen (allgemeinen) Pointer soll A Zugriff auf alle möglichen Instanzen von B haben, und genau da liegt das Problem.
    Über einen Aufruf von z.B.

    A _a("int");
    

    soll im Konstruktor der _B Zeiger in A auf eine neue B<int> Instanz gesetzt werden.
    So, kann man sowas überhaupt machen? Ich meine ein Pointer ist ein Pointer, egal was er repräsentiert, also könnte man nich einen "allgemeinen B"-Zeiger anlegen der für alle B<int> genauso funktioniert wie für alle B<float>?
    Oder notfalls jedes mal, wenn A eine neue Operation für B hat, den _B Zeiger anhand des gespeicherten Strings neu interpretieren? Irgendwas : P



  • ein template mit einem dynamisch festlegbaren typen zu instanziieren geht nicht.

    du könntest verwenden: void-zeiger, eine basisklasse, von der alle B-templates erben oder so etwas wie boost::any.

    werde doch mal noch etwas genauer.



  • NatOp schrieb:

    ...

    Grundsätzlich:
    Die Auflösung von Templates werden ausschließlich zur Compilezeit durchgeführt, eine dynamische Auslösung über Strings zur Laufzeit ist daher nicht möglich.

    Was soll die Klasse A mit dem "allgemeinen" Pointer anstellen? Ohne das A den Typ kennt wird es schwierig diesen Wert zu interpretieren, sofern du nicht dir merkst mit welchen Typ du arbeitest und das viel mit switches etc. tust. Aber auch hier bleibt das Problem das man keine generische Rückgabe etc. sauber hinbekommt.

    cu André



  • Alle Funktionen von B sind boolean; Der Zeiger in A zu B soll so zum Zugriff dienen, also

    bool A::exec(string what) {
        return _B->exec(what);
    }
    

    bzw

    bool A::exec(string what) {
        if (Btype == "int")
        {
            return ((B<int> *) _B)->exec(what);
        }
        else if .....
    }
    

    wenns dafür nen komplett anderen Ansatz gibt wär ich auch glücklich damit; mir gehts nur darum dass A mittels eines Strings beim Konstruktoraufruf ein Array zur Verfügung hat, das von dem Typ ist, der im String dargestellt ist.

    edit:

    queer_boy schrieb:

    void-zeiger, eine basisklasse, von der alle B-templates erben oder so etwas wie boost::any.

    hm hört sich gut an, wie säh die syntax für sowas circa aus? ^^



  • NatOp schrieb:

    wenns dafür nen komplett anderen Ansatz gibt wär ich auch glücklich damit; mir gehts nur darum dass A mittels eines Strings beim Konstruktoraufruf ein Array zur Verfügung hat, das von dem Typ ist, der im String dargestellt ist.

    das heißt der typ von B<X> wird im konstruktor bereits festgelegt?



  • queer_boy schrieb:

    das heißt der typ von B<X> wird im konstruktor bereits festgelegt?

    genau; im konstruktor von a.
    allerdings kann/konnte ich a nich generisch machen, weil ich in einer anderen klasse A' alle von A' erstellten As in einer map verwalte, hier hatte ich wieder das template problem wo ich nicht weiß wie ich die map in A' deklarieren muss, damit sie sowohl A<short> als auch A<long> pointer frisst...



  • du könntest z.b. B eine basisklasse verpassen und den konstruktor von A selbst zu einem template machen.

    class B_Base
    {
    public:
        virtual bool exec (/* ... */);
        ~virtual ~B_Base () {}
    };
    
    template <class T>
    class B : public B_Base { /* ... */ };
    
    class A
    {
       B_Base* b;
    public:
       template <class T>
       A (A const& data) : b(new B<T>(data))
       {
       }
    };
    


  • queer_boy schrieb:

    du könntest z.b. B eine basisklasse verpassen und den konstruktor von A selbst zu einem template machen.

    ouh das sieht perfekt aus; krieg gleich besuch aber werds morgen gleich ma ausprobieren, vielen dank schonmal



  • ahh funktioniert super : D vielen dank nochmal


Anmelden zum Antworten