Erweitern Sie das Parameterpaket beim Aufrufen der Methoden der Basistypen, wenn die variadic-Vorlagenklasse von Vorlagenargumenten geerbt wird

gmoshkin

Im Grunde möchte ich also eine Klasse definieren, die von einer beliebigen Anzahl von Klassen erbt und eine Methode enthält, die die überladene Methode aller Basisklassen aufruft.

Ich habe versucht, dies zu schreiben, aber es wird nicht kompiliert:

class Foo
{
public:
    void method()
    {
        std::cout << "Foo::method()\n";
    }
};

class Bar
{
public:
    void method()
    {
        std::cout << "Bar::method()\n";
    }
};

template <typename... Ts>
class Combined: public Ts...
{
public:
    Combined(const Ts&... ts): Ts(ts)... {}
    Combined(Ts&&... ts): Ts(std::move(ts))... {}

    template <typename U>
    void call_methods()
    {
        U::method();
    }

    template <typename U, typename... Us>
    void call_methods()
    {
        U::method();
        call_methods<Us...>();
    }

    void method()
    {
        call_methods<Ts...>();
    }
};


int main(int argc, char *argv[])
{
    Combined<Foo, Bar> obj({}, {});
    obj.method();
    return 0;
}

Der Compiler sagt folgendes:

test.cpp:42:9: error: call to member function 'call_methods' is ambiguous
        call_methods<Us...>();
        ^~~~~~~~~~~~~~~~~~~
test.cpp:47:9: note: in instantiation of function template specialization
      'Combined<Foo, Bar>::call_methods<Foo, Bar>' requested here
        call_methods<Ts...>();
        ^
test.cpp:57:9: note: in instantiation of member function
      'Combined<Foo, Bar>::method' requested here
    obj.method();
        ^
test.cpp:33:10: note: candidate function [with U = Bar]
    void call_methods()
         ^
test.cpp:39:10: note: candidate function [with U = Bar, Us = <>]
    void call_methods()
         ^

Grundsätzlich besteht eine Mehrdeutigkeit zwischen call_methods<U = Bar>und call_methods<U = Bar, Us = <>>. Aber wenn ich a deklariere void call_methods() {}, wird es call_methods<Us...>();aus irgendeinem Grund nicht mit dem übereinstimmen .

Wenn es noch nicht klar ist, möchte ich Combined<Foo, Bar>::method()anrufen Foo::method()und Bar::method().

Ich weiß, dass ich dies wahrscheinlich implementieren kann, indem ich a tuplemit den Objekten der entsprechenden Typen als Member habe und einfach über sie iteriere, aber ich möchte wirklich eine Lösung finden, die dem, was ich geschrieben habe, näher kommt.

jrok

Um Ihre Lösung zu reparieren, deaktivieren Sie die zweite Überladung, wenn das Parameterpaket leer ist:

template <typename U, typename... Us>
typename std::enable_if< (sizeof...(Us) > 0) >::type
call_methods()
{
    U::method();
    call_methods<Us...>();
}

Beseitigt Mehrdeutigkeiten.

Live-Beispiel.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Identifizieren Sie die Basisklasse, von der eine Eigenschaft geerbt wird

Der in Abstract Class implementierte Action-Listener wird nicht von den Klassen geerbt, die ihn erweitern

Ableitung von Vorlagenargumenten mit Vorlagenklasse innerhalb der Vorlagenklasse

Das Abziehen / Ersetzen von Vorlagenargumenten ist fehlgeschlagen, wenn linearRegression in der Eigen 2-Bibliothek verwendet wird

Ermöglicht die V-Sprache das Erweitern von Basistypen?

Kompilieren Sie die Überprüfung der Zeitexistenz für eine Memberfunktion mit Signaturanpassung an das Variadic-Parameterpaket

Deklarieren Sie den Funktionszeiger in der Vorlagenklasse aus Vorlagenargumenten

Metaklassen: Warum wird die Methode nicht von der Basisklasse geerbt?

Wie greife ich auf die Objekteigenschaften von List <Interface> zu, wenn die Klasse von der Schnittstelle geerbt wird?

Beim Aufrufen von Methoden für ein Objekt wird der Fehler "Aufruf der Mitgliedsfunktion im Array" angezeigt

Hinzufügen von Methoden in einer Klasse, die von der abstrakten Basisklasse geerbt wurde?

Aufrufen der asynchronen Methode der Superklasse von der asynchronen Methode beim Erweitern der Klasse

ist das Ändern von Singleton-Klassencodes die einzige Möglichkeit, die Funktionalität des Singletons zu erweitern, wenn das Singleton-Muster der Aufzählungsversion verwendet wird?

Wenn Sie die post-Methode aufrufen, geben Sie die if-Anweisung ein, wenn das Kennwort entspricht, aber meine res in der if-Anweisung wird ignoriert. Warum?

Reagieren Sie das Senden von Formularen verhindern, wenn die Eingabetaste innerhalb der Eingabe gedrückt wird

Blazorkomponente: Aktualisieren Sie die übergeordnete Komponente, wenn das Modell von der untergeordneten Komponente aktualisiert wird

erhalten Sie die eingegebenen Parameter, wenn das Programm von der Befehlszeile ausgeführt wird?

erhalten Sie die eingegebenen Parameter, wenn das Programm von der Befehlszeile ausgeführt wird?

Suchen Sie den Pfad, der von der Befehlszeile beim Aufrufen einer ausführbaren Datei verwendet wird

Annotation wird nicht von der Schnittstellenmethode geerbt

Erweitern Sie die Zeile von QTableView, wenn der Editor in der Höhe wächst

Zwei Methoden, die von einer Methode in der Klasse geerbt wurden, unterscheiden sich in Instanzen, nicht wahr?

Erweitern Sie eine Vorlagenklasse mithilfe der Typdefinition in der Unterklasse

Warum wird das Objektfeld beim Erweitern der App nicht initialisiert?

Erweitern Sie den SVG-Tab, wenn der Text erweitert wird, ohne die Seiten zu dehnen

Das Ändern von Bildlaufeinsätzen wird beim Aufrufen der Tastatur automatisch animiert

Wie übergebe ich andere Vorlagenparameter, wenn die Vorlagenklasse das Parameterpaket verwendet?

Der Abzug von Vorlagenargumenten schlägt fehl, wenn eine Liste mit geschweiften Initialisierern verwendet wird

NullPointerException beim Erweitern von BaseClass, wo der Treiber initialisiert wird

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv