Einen Zeiger auf eine Funktion mit variadic Templates und Argumenten als Templateargument



  • Hallo,
    ich bin auf folgendes Szenario gestoßen:
    Ich möchte eine Map (oder Liste oder irgendein anderer Container) mit Funktionszeigern beliebiger Argumente (und Rückgabetypen) füllen. Also so sieht es gerade aus:

    unordered_map<typename template<class...Types>t(*)(Types...arg)>Bernd;
    

    In echt hab ich unordered_map in einen eigenen Datentyp gepackt, aber der funktioniert genauso.
    Wenn ich das mit dem gnu-Compiler (mit std=c++20) kompiliere, sei das template-argument 1 ungültig. Gibt es da sowas wie Beschränkungen, was als Typ bei Template erlaubt ist? Oder ist es nicht möglich das Template des Funktionszeigers zu einem Teil des Funktionszeigertyps zu machen?



  • @Ichwerdennsonst sagte in Einen Zeiger auf eine Funktion mit variadic Templates und Argumenten als Templateargument:

    Oder ist es nicht möglich das Template des Funktionszeigers zu einem Teil des Funktionszeigertyps zu machen?

    Ich nehme an dass das einigermassen verworren formuliert ist, du aber das richtige meinst. Also: ja, richtig, das geht so nicht.

    mit Funktionszeigern beliebiger Argumente

    Ein Funktions-Template ist keine Funktion. Ein Funktions-Template ist eine Vorlage aus der Funktionen erstellt werden können. Ein Funktionszeiger kann immer nur auf eine Funktion zeigen, nicht auf ein Funktions-Template. Und so etwas wie Funktions-Template-Zeiger gibt es in C++ nicht.

    Das selbe gilt für Klassen vs. Klassen-Tempaltes. std::pair ist keine Klasse und man kann keine Zeiger auf beliebige std::pair definieren. std::pair<int, bool> ist eine Klasse und mann kann Zeiger auf std::pair<int, bool>.

    Der Grund warum das so ist hat damit zu tun dass C++ typischerweise "ahead of time" kompiliert wird (im Gegensatz zu interpretierten oder "just in time" kompilierten Sprachen).

    Wenn das Set an möglichen Parameterlisten eingeschränkt ist, dann kann man das was du machen willst auf umwegen erreichen. Generisch geht es in C++ nicht.

    Ich frage mich aber was du eigentlich erreichen willst. Google mal nach dem Begriff XY Problem.


Anmelden zum Antworten