7


0

複数の引数を持つ関数でstd :: transformを呼び出す方法はありますか

こんにちは私は署名がある機能を持っています

std

string f(double x、double param1、double param2、double param3);

param1、param2、param3の特定の値に対してstd

transformのようなものを使用して、パラメーターxのstd :: vector xvaluesで呼び出したいと思います。

以下と同等です:

double param1(1.);
double param2(1.1);
double param3(1.2);
std::vector results();
for (std::vector::const_iterator it = xvalues.begin() ; it != xvalues.end() ; ++xvalues)
{
  results.push_back(f(*it, param1, param2, param3);
}

これをどのようにもっとエレガントに行うことができますか?

よろしくトニー

3 Answer


16


boost::bindを調べると、名前が示すように、引数を「バインド」できます。関数 f

 std::transform([...], boost::bind(&f, _1, param1, param2, param3));

このバインドの結果は単項関数です( _1`は呼び出される引数のプレースホルダーです):他のすべてのパラメーターは固定値 param1`、 param2、` param3`を持ちます。


7


完全を期すために、C ++ 0xバージョン、またはラムダに関する大騒ぎは何ですか?

std::transform([...], [=](double i){ return f(i, param1, param2, param3); });


3


icecrimeが示唆したように、ここでは `boost

bind`が最適なオプションです。 ただし、何らかの理由で「boost」を使用できない場合は、次のようなユーザー定義のファンクターを使用していつでも実行できます。

using namespace std;

string f(double x, double param1, double param2, double param3)
{
    return string();
}

struct Caller
{
    Caller(vector& results) : m_res(results)
    {

    }
    void operator()(double x)
    {
        m_res.push_back(f(x, 1.0,2.0,3.0));
    }

private:
    vector& m_res;
};

int main()
{
    vector d;
    vector r;

    d.push_back(1.0);
    d.push_back(2.0);

    Caller c(r);
    for_each(d.begin(), d.end(), c);

}