Vorlagenfunktion als Vorlagenargument
In C kann generische Programmierung durch Funktionszeiger oder Vorlagen erreicht werden. Während Vorlagen Inline-Funktionsaufrufe gewährleisten, stoßen sie beim Umgang mit generischen Funktionen selbst auf Einschränkungen.
Problemstellung
Beachten Sie den folgenden Code:
<code class="cpp">void a(int) { // do something } void b(int) { // something else } template<void (*param)(int) > void function() { param(123); param(456); }</code>
Während diese Vorlagenfunktion die Wiederholung zwischen Funktion1 und Funktion2 vereinfacht, wird es problematisch, wenn a und b selbst generisch sind:
<code class="cpp">template<typename T> void a(T t) { // do something } template<typename T> void b(T t) { // something else } template< ...param... > // ??? void function() { param<SomeType>(someobj); param<AnotherType>(someotherobj); }</code>
Lösung: Vorlagenvorlagenparameter
Um die generische Funktion mit den generischen Funktionen a und b zu definieren, müssen wir Vorlagenparameter verwenden. Eine direkte Übergabe dieser Funktionen als Typen ist jedoch nicht möglich. Daher verwenden wir einen Workaround mit Dummy-Strukturen:
<code class="cpp">template<typename T> struct a { static void foo(T = T()) {} }; template<typename T> struct b { static void foo(T = T()) {} }; template<template<typename P> class T> void function() { T<SomeObj>::foo(); T<SomeOtherObj>::foo(); }</code>
Durch Angabe des Template-Template-Parameters als Dummy-Strukturen a und b können wir die Template-Funktion instanziieren und die generischen foo-Methoden innerhalb der Funktion aufrufen.
Das obige ist der detaillierte Inhalt vonKönnen Template-Funktionen als Template-Argumente in C übergeben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!