Genau, warum so umständlich...
Hier muss man auch aufpassen, weil das evtl. gar nicht das ist, was du haben willst. Einen Functor (eine Klasse, die "operator ()" definiert) könntest du hier nämlich nicht benutzen.
So wie du es schreibst, ist das kein Typen-Templateparameter, sondern etwas wie ein int. Und bei diesen Konstanten gibt es einige Einschränkungen, wie z.B. "external linkage." (ich muss mir dazu mal eine verständliche Definition raussuchen, das ist nicht besonders intuitiv)
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
template<typename Func_t>
class Bar
{
Bar (const Func_t& func) : func_ (func) { }
private:
Func_t func_;
};
|
So würde es auch gehen, und du bist flexibler, denn es gehen auch Functoren, so dass du in diesen einen Status haben kannst -- geht mit direkten Funktionszeigern ohne Objekt nicht so gut -- und du bist nicht so sehr auf den Ergebnistyp festgelegt, solange dieser intern in den richtigen Typ konvertiert werden kann -- das kann allerdings auch ein Nachteil sein.
Beim Static bist du vermutlich darauf reingefallen, dass es sich bei deinem "random" gar nicht um eine Member-Methode handelt. Das ist nämlich auch nicht intuitiv in C++... static an einem Member bedeutet, dass der Member auch ohne Objekt funktioniert und überall sichtbar ist, wo dies auch für die Klasse gilt, static an einer globalen Funktion bedeutet, dass nur in der aktuellen "Compilier-Einheit" (dem .o File) sichtbar ist. Im letzteren Fall hat sie dann offensichtlich nicht die Eigenschaft "external linkage." Versuch mal einen statischen Non-Member an anderer Stelle mit "extern" wieder sichtbar zu machen. Spätestens der Linker wird dir das einfach um die Ohren hauen