4

関数の範囲に引数を適用する標準的な方法はありますか? 以下にリストされているような解決策を思いつきましたが、それは間違っているように感じます.そのようなロジックを構築するための何かがすでにあるはずです.

template<typename Function, typename Result, typename Argument>
struct apply_argument_t {
    Argument x;
    Result operator () (Function f) {
        return f (x);
    }
};

したがって、単純な使用例:

transform (in.begin(), in.end(), out.begin(), apply_argument(x));

意図的に実装の詳細をスキップしました。

編集:とにかく、彼らが求められたように:

in単項関数の範囲です (例: vector<int(*)(char)>)

outこれらの単項関数の結果の範囲です (例: vector<int>)

apply_argument構造に似ていますが、テンプレートの指定と初期化はありません (例: apply_argument_t<int(*)(char), int, char>)

また、C++11 のソリューションが検索されていないという発言を見逃していました。

4

3 に答える 3

1

意図的に実装の詳細をスキップしました。

これらの詳細には、たとえばArgumentタイプから取得した場所が含まれます。

とにかく、ラムダを使用してください。

于 2012-12-02T13:36:16.887 に答える
1

私はアルフに同意しますが、あなたの場合にそれを行う方法を示しましょう.

C++ 11 を使用する場合のラムダに関する問題の解決策を次に示します (私は使用Functionしますが、独自の特定の関数型を使用する必要があります。)

Argument x;
transform (in.begin(), in.end(), out.begin(),
  [x](Function f)
  {
    return f(x);
  }
);

ウィキペディアでさらに読む、C++ 11。

于 2012-12-03T05:13:46.517 に答える
0

C++11 を使用する予定がない場合は、<functional>STL を使用する別の解決策があります。

#include <functional>
#include <algorithm>

template<typename Argument, typename Result>
Result apply_function(Return (*f)(Argument), Argument x)
{
  return f(x);
}

transform (in.begin(), in.end(), out.begin(), bind2nd(ptr_fun(apply_function), x) );

しかし、あなたのソリューションはよりクリーンだと思います。考えられる単純化は 1 つだけです。

template<typename Argument, typename Result>
struct apply_argument_t {
    Argument x;
    Result operator () (Result (*f)(Argument)) {
        return f (x);
    }
};

Boost lambda library を使用した解決策があるはずですが、何らかの理由で機能しません:

#include<boost/lambda/lambda.hpp>
#include<boost/lambda/bind.hpp>
using namespace boost::lambda;
transform(in.begin(), in.end(), out.begin(), bind(_1, x));

こちらも参考に。(私もすべてを試しましprotectたが、うまくいきませんでした。)

于 2012-12-08T08:26:12.617 に答える