szl*_*any 1 c++ lambda qsort c++11
我正在尝试为qsort的比较器创建一个内联函数 - 类似这样:
function<int(int,int)> comparesort = [smarkers, emarkers, strSearch] (int *arg1, int *arg2) { return 0; };
qsort(sortptrs, nKeywords, sizeof(int), comparesort);
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误
IntelliSense:没有合适的转换函数,从"std :: tr1 :: function"到"int(__ cdecl*)(const void*,const void*)"存在
好的 - 我把它改成了这个
auto comparesort = [sortptrs, smarkers, emarkers, strSearch] (int arg1, int arg2)
{
int a = 0;
.
.
.
return a;
};
std::sort(sortptrs, sortptrs + nKeywords, comparesort);
Run Code Online (Sandbox Code Playgroud)
并且它给出了一个错误:
错误C3499:已指定具有void返回类型的lambda无法返回值
[编辑于7月30日下午3:55]
我实际上需要一个指针排序 - 我有一个单词的开始和结束字节数组(在从VB.Net托管代码传入的字符串中找到).我还有一个包含"1,2,3 ..."的指针数组,我需要对指针进行排序.
似乎我不能用std :: sort这样做,所以我实现了自己的shell排序......
签名qsort采用类型的函数指针int(*)(const void*, const void*).你试图给它一个function<int(int, int)>,它不是一个函数指针,而是一个封装东西的对象(可能是一个函数ptr,可能是一个函子),它可以被调用int(int, int)(注意它没有正确的签名,即使它是一个函数指针).
qsort基本上是与c向后兼容的遗留函数.在c ++中,我强烈建议忘记它并使用std::sort:
auto comparesort = [smarkers, emarkers, strSearch] (const int& arg1, const int& arg2) { return false; };
//directly store the lambda, avoiding the overhead of creating a `function<...>`
std::sort(sortptrs, sortptrs + nKeywords, comparesort);
Run Code Online (Sandbox Code Playgroud)
qsort是直接采用函数指针的旧 C API。您不能将它与其他任何东西(例如 lambda)一起使用。相反,使用std::sort.