是否有一些更标准的方法将参数应用于函数范围?我想出了下面列出的解决方案,但感觉不对 - 应该已经有了构建这种逻辑的东西。
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解决方案的说法。
答案 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
,但它们无效。)