Ich suche nach den Regeln, nach denen C ++ - Vorlagen als Argumente übergeben werden.
Dies wird von C ++ unterstützt, wie in einem Beispiel hier gezeigt:
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
Das Erlernen dieser Technik ist jedoch schwierig. Das Googeln nach "Funktion als Vorlagenargument" führt nicht zu viel. Und die klassischen C ++ - Vorlagen The Complete Guide diskutieren es überraschenderweise auch nicht (zumindest nicht aus meiner Suche).
Die Fragen, die ich habe, sind, ob dies gültiges C ++ ist (oder nur eine weit verbreitete Erweiterung).
Gibt es auch eine Möglichkeit, einen Funktor mit derselben Signatur während dieser Art des Vorlagenaufrufs austauschbar mit expliziten Funktionen zu verwenden?
Die folgende tut nicht Arbeit in dem obigen Programm, zumindest in Visual C ++ , da die Syntax offensichtlich falsch ist. Es wäre schön, eine Funktion für einen Funktor ausschalten zu können und umgekehrt, ähnlich wie Sie einen Funktionszeiger oder Funktor an den std :: sort-Algorithmus übergeben können, wenn Sie eine benutzerdefinierte Vergleichsoperation definieren möchten.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Hinweise auf einen oder zwei Weblinks oder eine Seite im C ++ - Vorlagenbuch sind willkommen!
-std=gnu++17
. Kann ich das Ergebnis eines Capture-freien Lambda-Constexpr-Konvertierungsoperators in C ++ 17 als nicht typisiertes Argument für eine Funktionszeigervorlage verwenden? .