C++ 在代码体中定义函子

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

函子可以在函数体中局部定义吗

我能想到的局部定义函子的一个可能用途(特别是如果我们想使用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_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]))
    {
        ...
    }
}