将 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
的对象不可调用。有两个简单的修复:
更简单的 [和推荐] 解决方法是只获取对象的 fonc
成员:
... tabSortFctsFileList[a].fonc ...
通过添加合适的函数调用运算符使 sortFcts
类型的对象可作为谓词调用:
struct sortFcts {
// ...
bool operator()(const FileData &a, const FileData &b) const {
return this->fonc(a, b);
}
};
我正在尝试实现一个 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
的对象不可调用。有两个简单的修复:
更简单的 [和推荐] 解决方法是只获取对象的
fonc
成员:... tabSortFctsFileList[a].fonc ...
通过添加合适的函数调用运算符使
sortFcts
类型的对象可作为谓词调用:struct sortFcts { // ... bool operator()(const FileData &a, const FileData &b) const { return this->fonc(a, b); } };