2016-10-08 3 views
11

So implementieren Sie im abstrakten Code die abstrakte Basisklasse in einem allgemeinen Fall. Der Code ist von einer Bibliothek, an der ich gerade arbeite, vereinfacht. Eine explizite Implementierung für int und double ist also keine Option.So implementieren Sie eine abstrakte Methode, wenn die abstrakte Klasse in einem Variadic-Kontext verwendet wird

template <typename T> 
struct Foo 
{ 
    virtual void send(T t) = 0; 
}; 

template <typename...T> 
struct Bar : Foo<T>... 
{ 
    void send(T t) override { // does not compile because 
          // abstract method not implemented 
    } 
}; 

int main() { 
    // example usage 
    Bar<int, double> b; 

    b.send(1); 
    b.send(2.3); 
} 

Vielen Dank im Voraus.

Bearbeiten: Virtuelle zu abstrakten Methode hinzugefügt.

Antwort

6

Was ist mit dem folgenden Beispiel?

Zuerst denke ich, dass Sie virtual die send() Methode in Foo definieren müssen (wenn Sie es rein virtuell wollen).

Als nächst Sie eine Zwischen Template-Klasse deklarieren (Foo2), in dem die Umsetzung overridesend()

Last, können Sie eine Vorlage send() Methode in Bar verwenden, um die richtige virtuelle send() Methode auszuwählen.

#include <iostream> 

template <typename T> 
struct Foo 
{ virtual void send(T t) = 0; }; 

template <typename T> 
struct Foo2 : Foo<T> 
{ 
    void send(T) override 
    { std::cout << "sizeof[" << sizeof(T) << "] " << std::endl; } 
}; 

template <typename...T> 
struct Bar : Foo2<T>... 
{ 
    template <typename U> 
    void send (U u) 
    { Foo2<U>::send(u); } 
}; 

int main() 
{ 
    Bar<int, double> b; 

    b.send(1); // print sizeof[4] 
    b.send(2.3); // print sizeof[8] 
} 
+0

Hey, können Sie mir sagen, was der Unterschied ist zwischen: 'foo2 ...' und 'foo2 ' (Punkte außerhalb Klammer gegen innen Klammer) – Brandon

+0

@Brandon - sind völlig verschiedene Dinge; Wenn Sie 'Foo2 ' schreiben, deklarieren Sie eine einzelne Basisklasse 'Foo2 ' mit 'sizeof ... (T)' Template-Parametern; Wenn Sie 'Foo2 ...' schreiben, deklarieren Sie 'sizeof ... (T)' Basisklassen, 'Foo2 , Foo2 , Foo2 /* etc * /' mit jeweils einem einzelnen Template-Parameter – max66

Verwandte Themen