【问题标题】:std::for_each and functors - what signatures can operator() have?std::for_each 和仿函数 - operator() 可以有哪些签名?
【发布时间】:2023-03-29 08:27:01
【问题描述】:

我想使用std::for_each 调用循环一些值并调用函子将值映射到字符串,然后将该值返回给for_each,如下所示:

#include <iostream>
#include <map>
#include <string>
using std::string;
using std::map;
using std::cout;
using std::endl;

struct myfunctor
{
    myfunctor(map<int, string>& x) : mymap(x) {
        cout << "Inside myfunctor ctor" << endl;
    };

    map<int, string>& mymap;

    string operator()(int mapthis)
    {
        cout << "Inside myfunctor operator(" << mapthis << ")" << endl;
        return mymap[mapthis];
    }
};

int main()
{
    map<int, string> codes { {1, "abel"}, {2, "baker"}, {3, "charlie"} };

    cout << "Main() - construct myfunctor" << endl;
    myfunctor t(codes);

    int arr[] = {1, 2, 3};

    string blah;
    cout << "Main() - begin for_each" << endl;
    std::for_each(arr, arr+2, blah.append(t));
    cout << blah << endl;
}

它无法编译,因为它无法从 myfunctor 转换为 string。但即使它确实如此,从operator() 返回一些东西是否合法,以便由for_each 应用,就像我正在尝试做的那样?除了for_each的隐含范围变量之外,是否可以将其他参数传递给operator()

如果operator()可以有返回值,我该如何写一个myfunctor-to-string的转换方法?

我从未见过除void operator()(SingleArgument)以外的任何例子

【问题讨论】:

    标签: c++ foreach functor


    【解决方案1】:

    首先,您必须将函子作为第三个参数传递给std::for_each。您正在传递函数调用blah.append(t) 的结果。此外,函子应该在for_each 期间完成所有工作,因此您必须将对append 的调用转移到operator() 内部。最简单的方法:只需将您的字符串作为参考传递。

    struct myfunctor
    {
        myfunctor( string& toAppend, map<int, string>& x ) : appendage(toAppend), mymap( x ) {
            cout << "Inside myfunctor ctor" << endl;
        };
    
        map<int, string>& mymap;
        string& appendage;
    
        void operator()(int mapthis)
        {
            cout << "Inside myfunctor operator(" << mapthis << ")" << endl;
            appendage.append( mymap[mapthis] );
                //std::for_each will not use a return value of this function for anything
        }
    };
    
    void main2()
    {
        map<int, string> codes { {1, "abel"}, { 2, "baker" }, { 3, "charlie" } };
    
        cout << "Main() - construct myfunctor" << endl;
    
    
        int arr[] = { 1, 2, 3 };
    
        string blah;
        myfunctor t( blah, codes ); //Pass in blah so the functor can append to it.
        cout << "Main() - begin for_each" << endl;
        std::for_each( arr, arr + 3, t ); //arr+3 to loop over all 3 elems of arr
        cout << blah << endl;
    }
    

    【讨论】:

    • 正是我想要的。我是否正确理解这里的想法是 for_each 的第三个参数是一个 object,而不是真正的函数调用?
    • @chap 是一个定义了operator() 的对象,() 将被for_each 用范围的元素重复调用。请注意,如果签名匹配,则函数指针符合条件。
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多