Fireplace April 2026

C++ template function typedef möglich?

DaysShadow

Admiral
Registriert
Jan. 2009
Beiträge
9.266
Hi,

Da man ja Template-Klassen per
Code:
typedef class class_name< typename params... > class_typedef
zur häufigen Benutzung vereinfachen kann, dachte ich, dass dies auch mit Funktionen möglich ist, aber auf selbigem Wege ist das scheinbar nicht möglich.
Code:
typedef typename function_name< typename params... > function_typedef

Mache ich irgendwo einen Fehler oder ist das generell so nicht möglich?

Danke!
 
Das geht nicht, weil das function template kein Typ ist, sondern eine Funktionsdeklaration.
Bsp:
PHP:
template<typename T> void fun(T p);
hat unspezialisiert den Typ "void ()(T)". Den könntest du (wenn du ihn spezialisierst) mit dem einem typedef versehen, aber eben nicht das function template.

Du kannst aber statt des typedef einfach eine inline Funktion nutzen, was ohne Nachteile möglich ist.
PHP:
template<typename T> void fun(T p)
{...}
void pseudotypedef(int p)
{
  fun<int>(p);
}
 
Zuletzt bearbeitet:
Wenn ich dich richtig verstehe, möchtest du per typedef einen Funktions-Pointer auf eine Template-Funktion definieren. Ist das richtig? Falls ja, so weit ich weiß geht so etwas in C++ nicht.

Code:
// geht ned ... löst beim Compiler heftige Zuckungen aus

typedef template < typename A, typename B >
A ( *templateFuncPtr ) ( const A& a, const B& b );

templateFuncPtr< double, int > myFuncPtr = &bla< double, int >;

Zumindest VC++ 2010 kotzt sich bei diesem Konstrukt die Seele aus dem Leib, und ich vermute mal, daß auch gcc da kapitulieren müßte.

Was du aber stattdessen tun kannst, ist eine Art Funktor-Template zu schreiben, das halt operator () nutzt, um eine Funktion zu emulieren.

Code:
template < typename A, typename B >
struct Functor
{
	const A operator () ( const A& a, const B& b ) const
	{
		return A( a + b );
	}
};

typedef Functor< double, int > Double_Int_Functor;

int main()
{ 
	Double_Int_Functor test;

	const double res = test( 3.0, -1 );
}
 
Zuletzt bearbeitet:
Danke ihr beiden!

@antred:

Ich möchte keinen Pointer auf eine Template-Funktion, sondern wollte lediglich wie es z.B. bei Klassen auch geht, häufig vorkommende Spezialisierungen "typedeffen".
Also statt dass ich jetzt z.B. "void function<float, int>( param )" schreiben müsste, halt nur z.B. "void functionfi( param )" schreiben muss.

Allerdings ist es interessant was du da beschreibst, kannte ich bisher nicht, wie so vieles :)

@ghorst:

Das Beispiel ist das was ich mit dem typedef erreichen wollte und ist ja auch nicht mehr Aufwand als mit typedef, schöne Sache.
Aber jetzt weiß ich wenigstens, dass es so wie ich es dachte nicht geht.
 
mit Hilfe der Boost - Bibliothek ginge folgendes
Code:
#include <iostream>

#include <boost/function.hpp>

template<typename T> int template_func(T x) {
	return (x&1) ? 3*x+1 : x/2;
}

boost::function<int(int)> collatz = template_func<int>;


int main()
{
	std::cout << collatz(3) << "\n";
	return 0;
}

Hinter dem boost-function-template steckt imo ein Funktion-Objekt (Functor).
 
Zurück
Oben