3

C ++ 0xは、genericなどの古いバインダーの使用を廃止しbind1stましbind2ndstd::bind。C ++ 0xラムダはとうまくバインドしますが、デフォルトではラムダには、、、、、などのネストされたtypedefがないため、従来のbind1stおよびstd::bindbind2ndとはバインドしません。したがって、必要なtypedefが公開されるため、ラムダを古いバインダーにバインドする標準的な方法として役立つと思いました。argument_typefirst_argument_typesecond_argument_typeresult_typestd::function

ただし、std::functionこのコンテキストでの使用は、インスタンス化中に関数型を詳しく説明する必要があるため、使用するのが困難です。

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.

の便利なオブジェクトジェネレータが見つかりませんでしたstd::function。のようなものstd::make_fuctionがあればいいのにと思います。そのようなものは存在しますか?そうでない場合、ラムダを古典的なバインダーに結合する他のより良い方法はありますか?

4

2 に答える 2

2

そのようなことをしようとしたことはなく、完全な答えを提供する時間はありませんが、Boost.FunctionTypesで何かができると思います。

これがあなたにアイデアを与えるためのラフで不完全でテストされていないドラフトです:

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);
}
于 2010-04-07T20:20:45.250 に答える
1

なぜまだbind1stなどが必要なのかわかりません。私が考えることができるのは、古いコードをサポートすることだけです。実際にbind1st(f, a)は、etcに置き換えることができ[a](v){ return f(a, v); }、これは普遍的なソリューションです。

于 2011-06-25T03:59:19.123 に答える