gpt4 book ai didi

c++ - 如何提供 std::set 与另一个函数的比较函数

转载 作者:行者123 更新时间:2023-12-04 07:59:45 24 4
gpt4 key购买 nike

我正在使用一组指向类的指针,并提供了一个比较函数来通过比较对象而不是指针来对集合进行排序。我现在正在尝试编写另一个函数并为其提供与集合中使用的相同的比较函数,如下所示:

/* compset.cpp  -  a program to test compare function of std::set  */
#include <cstdio>
#include <cstdlib>
#include <set>

class foo {
int n;

public:
foo(int nn)
: n(nn)
{
}
friend bool operator<(const foo& a, const foo& b);
};

bool operator<(const foo& a, const foo& b)
{
return (a.n < b.n);
}

struct fooislt {
bool operator()(foo* a, foo* b) { return (*a < *b); }
};

class bar {
int m;

public:
bar(int mm)
: m(mm)
{
}
void func(std::set<foo*, fooislt>::iterator ita,
std::set<foo*, fooislt>::iterator itb, bool (*comp)(foo*, foo*));
};

void bar::func(std::set<foo*, fooislt>::iterator ita,
std::set<foo*, fooislt>::iterator itb, bool (*comp)(foo*, foo*))
{
if (comp(*ita, *itb)) {
// Do something
}
}

int main(int argc, char* argv[])
{
bar bar1(17);
std::set<foo*, fooislt> myset;
// set up myset
std::set<foo *, fooislt>::iterator it1, it2;
// determine it1 and it2
bar1.func(it1, it2, myset.key_comp);
}
来自 g++ 的错误消息是:

compset.cpp: In function ‘int main(int, char**)’:compset.cpp:40:27: error: invalid use of non-static member function ‘std::set<_Key, >_Compare, _Alloc>::key_compare std::set<_Key, _Compare, _Alloc>::key_comp() const [with >_Key = foo*; _Compare = fooislt; _Alloc = std::allocator<foo*>; std::set<_Key, _Compare, >_Alloc>::key_compare = fooislt]’40 | bar1.func(it1,it2,myset.key_comp);| ~~~~~~^~~~~~~~In file included from /usr/include/c++/10/set:61,from compset.cpp:5:/usr/include/c++/10/bits/stl_set.h:327:7: note: declared here327 | key_comp() const| ^~~~~~~~


我怎样才能使这项工作?

最佳答案

问题是什么。
问题是压缩器函数比函数的原始指针更复杂。
定义如下:std::set<foo*, fooislt>压实机是一类 fooislt其中定义了 operator() .现在,由于这是一个对象,因此无法将其转换为指向函数的指针。
简单的解决方案是使用 bar::func 的模板所以压缩函数将采用正确的类型:
https://godbolt.org/z/3Whn89

class bar {
int m;

public:
bar(int mm)
: m(mm)
{
}

template <typename F>
void func(std::set<foo*, fooislt>::iterator ita,
std::set<foo*, fooislt>::iterator itb, F comp);
};

template <typename F>
void bar::func(std::set<foo*, fooislt>::iterator ita,
std::set<foo*, fooislt>::iterator itb, F comp)
{
if (comp(*ita, *itb)) {
// Do something
}
}
或者,您可以使用 std::function<>隐藏模板使用能够执行正确的转换。
https://godbolt.org/z/frcjdK
class bar {
int m;

public:
bar(int mm)
: m(mm)
{
}

void func(std::set<foo*, fooislt>::iterator ita,
std::set<foo*, fooislt>::iterator itb, std::function<bool(foo*, foo*)> comp);
};

void bar::func(std::set<foo*, fooislt>::iterator ita,
std::set<foo*, fooislt>::iterator itb, std::function<bool(foo*, foo*)> comp)
{
if (comp(*ita, *itb)) {
// Do something
}
}

关于c++ - 如何提供 std::set 与另一个函数的比较函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66532509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com