C++ Template-Funktionen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
EyDu
Establishment
Beiträge: 100
Registriert: 24.08.2002, 18:52
Wohnort: Berlin
Kontaktdaten:

C++ Template-Funktionen

Beitrag von EyDu »

Hey ho,
ich hab' glaub ich eine ganz einfache frage, ich finde nur mit Google irgendwie die Antwort nicht. Ich habe eine Funktion der Form:

Code: Alles auswählen

template<int _k> int foo() {
   //do something useful
}
Ich könnte die Funktion nun natürlich mit

Code: Alles auswählen

foo<3>()
aufrufen. Ich bräuchte jetzt aber, weil es so schön praktisch wäre, einen Weg aus "foo<3>()" ein "foo3()" zu machen. Bei Klassen ginge das natürlich mit einem einfach "typedef", nur hinter die Funktionen komme ich gerade nicht. Ein

Code: Alles auswählen

#define foo3 foo<3>
würde ich nur sehr ungerne machen.

Viele Grüße,
Sebastian
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: C++ Template-Funktionen

Beitrag von Schrompf »

Wie wär's mit einer inline-Wrapperfunktion? In Release-Builds produziert die verlässlich keinen weiteren Code, und Du kannst sie nennen, wie Du magst. ob das mit typedef geht, weiß ich gar nicht... ich bezweifle es.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: C++ Template-Funktionen

Beitrag von kimmi »

Das einzige, was mir dazu einfällt wäre entweder ein Wrapper mit entsprechenden Namen oder sowas ( ungetestet ):

Code: Alles auswählen

template<int _k> int foo() 
{
  //do something useful
}

struct foo3
{
  enum three { arg = 3 };
  foo3()
  {
    foo<foo3::three>();
  }
};

// Aufruf
foo3 exec; 
Einen typedef auf eine Funktion wird IMHO schwer, ich habe auch in Google nichts brauchbares finden können. Fairerweise muß ich aber auch zugeben, daß ich den c++ Standard nicht im Kopf habe :).

Gruß Kimmi
EyDu
Establishment
Beiträge: 100
Registriert: 24.08.2002, 18:52
Wohnort: Berlin
Kontaktdaten:

Re: C++ Template-Funktionen

Beitrag von EyDu »

Schon mal vielen Dank für die schnellen Antworten, das geht wirklich fix hier :-)

Was bei mir noch ein wenig problematisch ist, dass meine Funktionen natürlich noch ein paar Parameter haben, die ich ungerne für jede Ausprägung hinschreiben würde. Eure Lösungen funktionieren und es sind auch nur drei/vier Ausprägungen, aber natürlich würde ich es lieber allgemeiner lösen. Diese Programmiererehre eben :lol:

Falls jemand eine allgemeine Lösung parat hat bin ich natürlich dran interessiert, mein eigentliches Problem ist jetzt im Prinzip gelöst. Ich werde heute abend selber noch einmal suchen und bei Erfolg ggf. noch berichten.

Bis dann,
Sebastian
Benutzeravatar
jgl
Establishment
Beiträge: 109
Registriert: 08.04.2009, 08:58

Re: C++ Template-Funktionen

Beitrag von jgl »

Blöde Frage, aber das ginge nicht?

Code: Alles auswählen

	template<int k> int foo()
	{
		return k*k;
	}

	int foo3()
	{
		foo<3>();
	}
Aber du willst das bestimmt allgemeiner haben, oder?
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: C++ Template-Funktionen

Beitrag von Aramis »

Das ist genau das, was Thomas weiter oben auch schon vorgeschlagen hat. Meiner Meinung nach ist das eine eher unsaubere Methode weil foo3() dann strenggenommen kein (compiletime-) Alias für foo<3> mehr ist.

Wenn du wirklich volle Flexibilität willst, könntest du auf Funktoren setzen. Z.B.

Code: Alles auswählen

template <int TN>
struct sqr
{
   int operator() (int f) {
      return f*f*TN; 
   }
};

typedef  sqr<3> sqr3;
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: C++ Template-Funktionen

Beitrag von kimmi »

Funktoren kämen dem gewünschten Verhalten wahrscheinlich am nächsten, da sie wirlich einen funktionsspezifischen Typedef darstellen.

Gruß Kimmi
Antworten