4

std::function戻り値を持ち、std::function他の std:: 関数で再帰的なさまざまな関数を使用することは可能ですか?たとえば、関数の関数ですか? つまり、関数の配列を 1 つの関数にまとめたいと考えています。

たとえば、基本的なチュートリアルを終了する

double genFunc(double x, std::function<double (double x)>f)
{
    double res = f(x);
    return res;
}

double square(double x){
    return x * x;
}

double dbl_sq(double x){
    return square(x * x);
}

これを変更して、ネストされたstd::function<std::function>呼び出しを許可するにはどうすればよいですか?

4

1 に答える 1

2

あなたが何を求めているのか完全にはわかりませんが、突き刺します。

では、std::functionネストされた が必要ですが、1 回の呼び出しですべての要素を呼び出しますか? これは、いくつかのことを実行できることを意味しますが、最も簡単なのは次のようなものです。

std::function<double(double)> nest(const std::function<double(double)> functions[], const int count) {
    if (count == 1) {
        return functions[0];
    }

    return [=](double input) {
        return nest(functions + 1, count - 1)(functions[0](input));
    };
}

int main()
{
    static const auto sq = [](double input) {
        return input * input;
    };

    static const auto dbl_sq = [](double input) {
        return sq(input * input);
    };

    static const auto dbl = [](double input) {
        return input * 2;
    };

    static const std::function<double(double)> sqrt = ::sqrt;

    // now lets construct a 'nested lambda'
    static const std::function<double(double)> funcs[] = {
        sq, dbl, sqrt
    };

    static const std::function<double(double)> func = nest(funcs, 3);

    std::cout << func(4) << std::endl;  // 5.65685
    std::cout << ::sqrt((4 * 4) * 2) << std::endl; // 5.65685
}

これは、関数の配列を単一の関数に単純に「折りたたむ」ものです。

これがあなたが求めているものでない場合は、元の質問を編集して、達成したいことをより明確にしてください。

于 2012-12-21T19:00:13.180 に答える