C ++:将参数应用于函数范围

时间:2012-12-02 13:30:15

标签: c++ function arguments

是否有一些更标准的方法将参数应用于函数范围?我想出了下面列出的解决方案,但感觉不对 - 应该已经有了构建这种逻辑的东西。

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解决方案的说法。

3 个答案:

答案 0 :(得分:1)

  

我故意跳过了实施细节。

那些细节包括你得到的地方,例如来自。{/ p>的Argument类型

无论如何,请使用lambda。

答案 1 :(得分:1)

我同意Alf,但是让我们告诉你如何在你的情况下这样做。

如果您使用C ++ 11,可以使用lambda来解决您的问题: (我使用Function,但您需要使用自己特定的函数类型。)

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

进一步阅读维基百科,C ++ 11。

答案 2 :(得分:0)

如果您不打算使用C ++ 11,那么使用STL中的<functional>会有不同的解决方案:

#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库,但it does not work出于某种原因:

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

Reference also here.(我已尝试过所有内容,protect,但它们无效。)