使用std :: stable_sort和一个指向函数的指针数组

时间:2015-11-27 18:41:34

标签: c++ arrays sorting function-pointers

我试图实现一个类,我可以根据一些不同的sort函数对文件列表进行排序。 我无法使用指针数组来调用函数。

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])但是它说我没有匹配运营商。 我该怎么做才能解决它?

1 个答案:

答案 0 :(得分:0)

您正在尝试传递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);
        }
    };