Bis das auto-Schlüsselwort es wirklich trivial macht, kann man sich auf die Konvention verlassen, dass Funktionsobjekte bestimmte typedef's bereitstellen, einschließlich result_type. Man muss nur eine einfache Funktion in ein Funktionsobjekt verpacken. Der standardmäßige "funktionale" Header stellt einige zur Verfügung (pointer_to_unary_function/pointer_to_binary_function zusätzlich zu einer Reihe von Wrappern für Mitgliedsfunktionen). Wenn diese nicht ausreichen, bietet die boost-Bibliothek noch leistungsfähigere Wrapper.
#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
int answer()
{
return 42;
}
template <class T>
T unknown()
{
return T();
}
template <class Function>
void foobar(Function unknown)
{
typename Function::result_type x = unknown();
std::cout << x << '\n';
}
int main()
{
foobar(boost::function<int()>(answer));
foobar(boost::bind(unknown<int>));
}
Und hier ein Beispiel, wie Sie eine Pointer_to_zeronary_function hinzufügen könnten. (Ich nehme an, dass die Hilfsfunktion ptr_fun, die bei der Erstellung einer solchen Funktion hilft, dem Standard-Namensraum hinzugefügt werden könnte, ebenso wie eine Überladung(?)
template <class T>
class pointer_to_zeronary_function
{
typedef T(*zeronary_func)();
zeronary_func func;
public:
typedef T result_type;
pointer_to_zeronary_function(zeronary_func f): func(f) {}
T operator()() const
{
return func();
}
};
template <class T>
pointer_to_zeronary_function<T> ptr_fun(T(*f)())
{
return pointer_to_zeronary_function<T>(f);
}
...
//usage:
foobar(ptr_fun(answer));
0 Stimmen
Ihre Frage umbenannt. Wir können sehen, dass es sich um eine Frage über C++ und generische Programmierung handelt, weil Sie eine Frage und wird als C++ und generische Programmierung bezeichnet. Was wir im Titel brauchen, ist ein Hinweis darauf, was die Frage est . Machen Sie es anderen, die eine ähnliche Frage haben, leichter, Ihre zu finden. SO soll durchsuchbar sein. Behalten Sie das im Hinterkopf, wenn Sie Fragen stellen :)