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类型。

无论如何,使用 lambda。

于 2012-12-02T13:36:16.887 回答
1

我同意 Alf,但让我们向您展示如何在您的情况下做到这一点。

如果您使用 C++11,以下是 lambdas 问题的可能解决方案:(我使用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) );

但我认为您的解决方案更清洁。我只能考虑一种可能的简化:

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