Verwendung von veralteten Bindemittel und C ++ 0x Lambdas
Frage
C ++ 0x hat die Verwendung von alten Bindemittel wie bind1st
und bind2nd
zugunsten von Generika std::bind
veraltet. C ++ 0x lambdas binden gut mit std::bind
aber sie nicht mit klassischen bind1st binden und bind2nd da standardmäßig lambdas haben keine verschachtelten typedefs wie argument_type
, first_argument_type
, second_argument_type
und result_type
.
Also dachte ich std::function
als Standardmethode zu binden lambdas zu den alten Bindemittel dienen kann, weil es die notwendigen typedefs aussetzt.
Allerdings std::function
Verwendung ist schwer, in diesem Zusammenhang zu verwenden, weil es Sie zwingt die Funktion Typen zu buchstabieren, während es instanziieren.
auto bound =
std::bind1st(std::function<int (int, int)>([](int i, int j){ return i < j; }), 10); // hard to use
auto bound =
std::bind1st(std::make_function([](int i, int j){ return i < j; }), 10); // nice to have but does not compile.
Ich konnte keinen bequemen Objektgenerator für std::function
finden. So etwas wie std::make_fuction
wäre schön zu haben. Gibt es so etwas gibt es? Wenn nicht, gibt es eine andere Art und Weise besser lamdas die klassischen Bindemittel binden?
Lösung
Sie nie versucht, so etwas zu tun, und ich habe nicht die Zeit, um eine vollständige Antwort zu geben, aber ich denke, dass etwas mit Boost.FunctionTypes getan werden könnte.
Hier ist eine grobe, unvollständig und nicht getesteten Entwurf Ihnen eine Vorstellung zu geben:
template <typename T>
struct AdaptedAsUnary : T
{
namespace bft = boost::function_types;
namespace bmpl = boost::mpl;
typedef typename bft::result_type<T>::type result_type;
typedef typename bmpl::front<typename bft::parameter_types<T>::type>::type argument_type;
AdaptedAsUnary(T t) : T(t) {}
};
template <typename T>
AdaptedAsUnary<T>
AdaptAsUnary(T t)
{
return AdaptedAsUnary<T>(t);
}
Andere Tipps
Ich weiß nicht, warum immer noch müssen Sie die bind1st usw. Das einzige, was ich denken konnte, ist alten Code zu unterstützen. Eigentlich kann bind1st(f, a)
durch [a](v){ return f(a, v); }
usw. ersetzt werden, und dies ist eine universelle Lösung.