C++ 在代码体中定义函子
函子可以在函数体中局部定义吗 我能想到的局部定义函子的一个可能用途(特别是如果我们想使用STL算法的话)是C++ 在代码体中定义函子,c++,C++,函子可以在函数体中局部定义吗 我能想到的局部定义函子的一个可能用途(特别是如果我们想使用STL算法的话)是 我们有两个向量 STD::矢量 >代码> < >代码> b>代码>,然后我们可以在很多方面平等地考虑它们。i、 e.a[i]=b[i](mod loop\u counter)循环计数器不断变化,我们在每次循环迭代中测试它们是否相等 for(int i=0 ; i<=10 ; ++i) { //Define binary predicate functor my_local_pred
我们有两个向量<代码> STD::矢量<代码> >代码> < <代码> >代码> b>代码>,然后我们可以在很多方面平等地考虑它们。i、 e.
a[i]=b[i](mod loop\u counter)
循环计数器不断变化,我们在每次循环迭代中测试它们是否相等
for(int i=0 ; i<=10 ; ++i)
{
//Define binary predicate functor my_local_predicate
//Test for equality using functor local to loop
std::equal(a.begin(), a.end(), b.begin, my_local_predicate)
// Do something if they are equal OR unequal
}
将函子定义移到main()
之前时,代码编译干净,执行正确
所以,即使在函数体中定义一个函子似乎是不可能的,我还是希望在每次迭代中用一些类似STL的好方法来改变等式条件 如果你能使用C++11,这就行了。在C++03中,不能使用本地类作为模板参数。您可以使用
std::accumulate
来代替本地类静态函数(以及存储结果的非本地结构):
for(int i=0 ; i<=10 ; ++i)
{
//Define binary predicate functor my_local_predicate
//Test for equality using functor local to loop
std::equal(a.begin(), a.end(), b.begin, my_local_predicate)
// Do something if they are equal OR unequal
}
(假设您被困在C++03中。)
您可以让您的functor从顶级作用域中定义的模板基类继承,然后仅引用基类(例如,使用mem_fun/bind1st)
模板
结构val_函子{
虚~val_函子(){}
虚空运算符()(T x)=0;
};
int main()
{
类EvenOddFunctor:public val_functor
...
std::对于每个(我的列表,我的列表+sizeof(我的列表)/sizeof(我的列表[0]),
标准:bind1st(
std::mem_fun(&val_functor::operator()),
(val_函子*)&偶奇数)
);
...
}
对于问题的第一部分,我不认为有必要使用本地定义的函数。您需要的只是一种选择不同功能的方法,这非常简单。例如:
std::function<bool(int,int)> my_functions[10];
my_functions[0] = std::equal_to<int>();
my_functions[1] = both_divisible_by_5;
...etc
for (int i=0; i<10; ++i)
{
if (std::equal(a.begin(), a.end(), b.begin, my_functions[i]))
{
...
}
}
std::function my_functions[10];
my_函数[0]=std::equal_to();
my_函数[1]=两个_可除_除以_5;
等
对于(int i=0),您使用哪个C++编译器?如果它足够新,那么lambdas可能是您的选择。可能的复制的@ jRADDPAR我使用GCC(Ubuntu/LINARO4.4.4-14Ubuntu5)4.4.5。
template <typename T>
struct val_functor {
virtual ~val_functor() {}
virtual void operator()(T x) = 0;
};
int main()
{
class EvenOddFunctor : public val_functor<int>
...
std::for_each(my_list, my_list+sizeof(my_list)/sizeof(my_list[0]),
std::bind1st(
std::mem_fun(&val_functor<int>::operator()),
(val_functor<int>*)&evenodd)
);
...
}
std::function<bool(int,int)> my_functions[10];
my_functions[0] = std::equal_to<int>();
my_functions[1] = both_divisible_by_5;
...etc
for (int i=0; i<10; ++i)
{
if (std::equal(a.begin(), a.end(), b.begin, my_functions[i]))
{
...
}
}