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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top