2017-02-03 3 views
1

Ich habe eine Vorlagenklasse, die ich in einer anderen Klasse verwenden möchte. Das Problem ist, dass ich die Vorlagenklasse verwenden möchte, ohne den tatsächlichen Typ zu kennen.Verwenden Sie Vorlagenklasse in einer anderen Klasse in C++

Ein einfaches Beispiel:

template <class T> 
class Foo{ 
    private: 
     T x_; 
    public: 
     void Foo(T); 
}; 

nun eine weitere Klasse mit Foo. Was würde Ich mag zu tun ist:

class Bar{ 
    private: 
     Foo foo_; 

    public: 
     Bar(Foo); 
}; 

Das Problem ist, dass Foo eine Vorlage Argument erfordert, wenn sie innerhalb Bar verwendet. Es wäre schön, wenn die Klasse BarFoo mit einem beliebigen Template-Argument behandeln würde. Gibt es eine Problemumgehung?

Antwort

6

Machen Bar selbst eine Klassenvorlage:

template <typename T> 
class Bar{ 
    private: 
     Foo<T> foo_; 

    public: 
     Bar(Foo<T>); 
}; 

Alternativ können Sie Foo unter einem gemeinsamen polymorphen Schnittstelle Typ-löschen. Dies beschränkt die Verwendung von Foo und führt Laufzeit- und Speicher-Overhead ein.

struct FooBase { 
    virtual ~FooBase() { } 
    virtual void Xyz(int) { } 
}; 

template <class T> 
class Foo : FooBase { 
    private: 
     T x_; 
    public: 
     void Foo(T); 
     void Xyz(int) override 
     { 
      // `T` can be used in the definition, but 
      // cannot appear in the signature of `Xyz`. 
     } 
}; 

class Bar{ 
    private: 
     std::unique_ptr<FooBase> foo_; 

    public: 
     Bar(std::unique_ptr<FooBase>&&); 
}; 
+0

Danke, Ihre erste Lösung ist schön und einfach! Ich habe mich nur gefragt: Wenn Sie eine hierarchische Struktur von Klassen haben, in denen Klasse A von B verwendet wird, wird von C usw. verwendet, dann ist es etwas ärgerlich, das Template-Argument immer weiterzugeben. – beginneR

+0

@beginneR: Können Sie ein Beispiel zeigen? Es ist eine ziemlich gewöhnliche Sache, die nicht zu nervig sein sollte. –

+0

Angenommen, meine 'Base' Klasse nimmt als Eingabe einen Vektor von' Foo' Klassen, aber das Problem ist, dass jedes 'Foo' im Vektor einen anderen Typ hat und ich nicht Ich möchte für jede Art von "Foo" eine "Base" -Klasse haben. – beginneR

Verwandte Themen