0

ich eine Template-Klasse haben:Wie man einen Vektor erstellen, die Elemente aller Arten von der gleichen Vorlage speichert Klasse

template<typename A, typename B, typename C> 
class blah{...}; 

ich eine std :: vector <> erstellen möchten alle möglichen Objekte von blah zu retten .

zum Beispiel

blah<float, int, string> 

oder

blah<string, string, char> 

diejenigen blah Objekte, obwohl aus dem gleichen Template-Klasse entstanden, sind im Wesentlichen verschiedene Typen. Wie kann ich einen std :: vector deklarieren, um alle zu speichern?

Ich dachte über std :: Variante, aber ich kann nicht, weil es zu benutzen, muss ich alle möglichen Template-Parameter-Kombinationen aufzuzählen:

std::variant<all possible template parameter combinations> 

ich über die Verwendung von std :: dachte jeder, ich kann ich nicht, weil ich nicht weiß, wie man cast von std :: any zurück zum richtigen typ eintippt?

Ich dachte an eine Basisklasse mit:

template<typename A, typename B, typename C> 
class blah : public blah_base 
{...}; 

und einen Vektor wie folgt erklären:

std::vector<blah_base*> 

aber wieder, ich weiß noch nicht, wie Stimmen aus blah_base eingeben * zurück zum richtigen Typ?

+7

Wie verwenden Sie die 'blah <...>' Instanzen? Was ist dein Anwendungsfall? Kannst du es nicht mit Vererbung und virtuellen Funktionen lösen? Was ist das * tatsächliche * Problem, das Sie versuchen zu lösen? –

+0

Kannst du die Definition von 'bla' angeben oder ist es zu lang? – skypjack

+0

Ich versuche, tief learning Neuronennetzwerk zu implementieren. Der Blah-Typ ist der Tensor. Ein Tensor könnte unterschiedliche Dimensionen, Gerätetypen und Datentypen haben. Also ist das echte Blah definiert als "Vorlage class {...};" –

Antwort

0

Nun, ohne zu wissen, was Ihr Anwendungsfall ist, werde ich davon ausgehen, dass Sie drei Vektoren haben werden; eine für jeden Vorlagentyp. Sie könnten blah als solche implementieren:

#include <vector> 

template<typename A, typename B, typename C> 
class blah 
{ 
public: 
    // Put stuff here. 
    void AddToVectorA(A item); 
    void AddToVectorB(B item); 
    void AddToVectorC(C item); 
private: 
    std::vector<A> _a; 
    std::vector<B> _b; 
    std::vector<C> _c; 
}; 

template<typename A, typename B, typename C> 
void blah<A,B,C>::AddToVectorA(A item) 
{ 
    _a.push_back(item); 
} 

template<typename A, typename B, typename C> 
void blah<A,B,C>::AddToVectorB(B item) 
{ 
    _b.push_back(item); 
} 

template<typename A, typename B, typename C> 
void blah<A,B,C>::AddToVectorC(C item) 
{ 
    _c.push_back(item); 
} 

int main() 
{ 
    blah<int, double, float> b; 
    b.AddToVectorA(2); 

    return 0; 
} 

Sie auch die drei Vektoren öffentlich machen könnte und die Leute können sie jedoch verwenden; Sie könnten auch in tuple suchen. FYI: Ich habe jetzt den Code getestet, es funktioniert.

+0

Mein Problem ist die Kombination von Typen ist riesig, Ich muss viele Vektoren haben, nicht nur 3. –

1

Im Grunde brauchen Sie Polymorphie. Alle Optionen, die Sie untersucht haben, sind Polymorphie, und das ist der beste Weg, dies zu lösen. Allerdings sagen Sie diese und andere Variationen:

Ich weiß nicht, wie Stimmen aus blah_base eingeben * zurück auf die richtige Art

Wenn Sie sich, dies zu tun finden benötigen, Sie tun etwas stimmt nicht. Entweder macht es keinen Sinn, eine std::vector<blah<...>> zu haben, oder deine Blahs müssen alle den bla_base-Vertrag erfüllen.

Man könnte dies mit einer virtuellen Funktion lösen:

class blah_base { 
public: 
    virtual void foo() = 0; 
}; 

Dann statt, welche Art von blah Sie hatte zu sagen haben, würden Sie die entsprechende foo Funktion rufen Sie einfach an das tut, was Sie wollen.

+0

Ich denke nicht, dass "ich etwas falsch mache". Ich denke, C++ fehlt die "Reflexion" -Funktion, deshalb. https://root.cern.ch/blog/status-reflection-c –

+0

siehe dies. mir ist nicht klar, ob C++ 1z reflektion hat. https://news.ycombinator.com/item?id=8651990 –

Verwandte Themen