4

是否可以std::function返回一个std::function并使用与其他 std::functions 递归的各种函数,比如函数的函数?换句话说,我想将一组函数折叠成一个函数。

例如离开基本教程

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嵌套的,但在一次调用中调用所有元素?这意味着你可以做几件事,但最简单的是,像这样:

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 回答