应用于数组的高阶函数

Posted

技术标签:

【中文标题】应用于数组的高阶函数【英文标题】:Function from a higher order applied to an array 【发布时间】:2014-12-27 09:29:05 【问题描述】:

我有一个特定类类型的向量;

vector<Song> database;

class Song

public:
    string getName() const;
    string getSinger() const;
    unsigned int getLength();
    unsigned short getYear() const;

private:
    char singer[51];
    char name[51];
    unsigned int length;
    unsigned short year;
;

请注意,向量不在 Song 类中。它在另一个班级。在另一个类中,我创建了一个更高阶的函数。该函数的参数之一是来自 Song 类的 getter:

void order(string, int, Song*, unsigned int (Song::*get)(), bool(*compare)(unsigned int, unsigned int));

但是,当我这样打电话时:

database[a].(obj->*get())

我明白,当我必须处理来自其他类的函数时,我必须引用该类的对象,并且还要引用该类的函数。我的问题是我是否可以传递一个函数引用来自动检测我正在使用的对象?

编辑

void Interface::order(string command, int findLength,
    Song* obj, unsigned int (Song::*get)(), bool(*compare)(unsigned int first, unsigned int second))

    for (unsigned int a = 0; a < database.size(); a++)
    
        if (compare(database[a].(obj->*get)(), stoi(command)))
        
            cout << "Deleting found match...\n";
            database.erase(database.begin() + a);
        
    

我在database[a].(obj-&gt;*get)() 收到错误消息 那里的错误是编译器需要一个成员名称。但是,我想提供一个不依赖于我传递的对象的函数。换句话说,我在问是否有一种构造类型允许我在这里传递一个函数作为参数,并且该函数将自动调用每个对象 [来自歌曲向量] 及其各自的 getter 方法。

【问题讨论】:

我不确定我是否完全理解您的问题,但我相信 std::function 可以满足您的要求。 您的意思是这样您就可以在您的Song::get 中使用this database[a] 不是 Song 吗?为什么不直接做database[a].getLength() ... 而您的 order 函数也获得了 Song* 啊,你的问题是“给定一个Song 对象和一个Song::*,我该如何调用该函数?” 【参考方案1】:

关于通过成员函数指针访问成员函数的-&gt;* 语法是正确的:这是当您有一个指向对象的指针时的语法。

通过成员对象访问成员函数还有另外一种语法:

(database[a].*get)()

这将在Song 对象database[a] 上调用get 指向的成员函数。

【讨论】:

以上是关于应用于数组的高阶函数的主要内容,如果未能解决你的问题,请参考以下文章

Javascript中具有递归的高阶函数

JavaScript 中的高阶函数

swift中高阶函数mapflatMapfilterreduce

Swift数组高阶函数

前端面试 JavaScript— 什么是高阶函数?数组中的高阶函数有哪些?

前端面试 JavaScript— 什么是高阶函数?数组中的高阶函数有哪些?