将 std::stable_sort 与指向函数的指针数组一起使用

Using std::stable_sort with a array of pointer to functions

我正在尝试实现一个 class,我可以使用它根据一些不同的排序功能对文件列表进行排序。 我在使用指向函数的指针数组进行调用时遇到了问题。

FileList.hpp :

class FileList
{
public:
enum sortStyle{EXTENSION, NAME, SIZE, DURATION, PATH};
//...
};

namespace SortFiles
{
    struct  sortFcts{
        FileList::sortStyle sort;
    bool (*fonc)(const FileData &, const FileData &);
    };
    bool                  sortExtension(const FileData &a, const FileData &b);
    bool                  sortName(const FileData &a, const FileData &b);
    bool                  sortDuration(const FileData &a, const FileData &b);
    bool                  sortSize(const FileData &a, const FileData &b);
    bool                  sortPath(const FileData &a, const FileData &b);
}

struct SortFiles::sortFcts tabSortFctsFileList[5] = {{FileList::EXTENSION, &SortFiles::sortExtension}, 
                              {FileList::NAME, &SortFiles::sortName},
                              {FileList::SIZE, &SortFiles::sortSize},
                              {FileList::DURATION, &SortFiles::sortDuration},
                              {FileList::PATH, &SortFiles::sortPath}};

FileList.cpp :

void                FileList::sort(FileList::sortStyle a)
{
    //std::stable_sort((this->_data).begin(), (this->_data).end(), SortFiles::sortPath);
    std::stable_sort((this->_data).begin(), (this->_data).end(), tabSortFctsFileList[a]);
}

其中 tabSortFctsFileList[] 只是我放置所有排序方法的结构的一个选项卡。 我的问题是,如果我使用注释的方式,它会工作,但是当我使用数组时,我有一个编译错误,我不知道为什么。我知道我可以使用一个巨大的开关,它会工作正常,但我不想。

这是错误消息的其中一行:

/usr/include/c++/4.8/bits/stl_algo.h:
 In instantiation of ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<FileData*, std::vector<FileData> >; _Compare = SortFiles::sortFcts]’:

/usr/include/c++/4.8/bits/stl_algo.h:3510:49:  
 required from ‘void std::__inplace_stable_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<FileData*, std::vector<FileData> >; _Compare = SortFiles::sortFcts]’
/usr/include/c++/4.8/bits/stl_algo.h:5710:52: 
 required from ‘void std::stable_sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<FileData*, std::vector<FileData> >; _Compare = SortFiles::sortFcts]’
FileList.cpp:71:88:   required from here
/usr/include/c++/4.8/bits/stl_algo.h:2159:29: error: no match for call to ‘(SortFiles::sortFcts) (FileData&, FileData&)’
if (__comp(*__i, *__first))

我觉得这里的问题是我不应该使用 (*fonc) 而应该使用 fonc 作为最后一个参数,但我已经尝试过类似的操作:(Tab[a] ) 但它说我无法匹配 operator。 我应该怎么做才能解决它?

您正在尝试传递类型为 sortFcts 的对象作为 std::stable_sort() 的谓词参数。但是,类型为 sortFcts 的对象不可调用。有两个简单的修复:

  1. 更简单的 [和推荐] 解决方法是只获取对象的 fonc 成员:

    ... tabSortFctsFileList[a].fonc ...
    
  2. 通过添加合适的函数调用运算符使 sortFcts 类型的对象可作为谓词调用:

    struct sortFcts {
        // ...
        bool operator()(const FileData &a, const FileData &b) const {
            return this->fonc(a, b);
        }
    };