gpt4 book ai didi

c++ - 比较函数对象的类型签名

转载 作者:行者123 更新时间:2023-12-02 10:19:25 24 4
gpt4 key购买 nike

如何在方法签名中使用比较函数对象类型?例如,这一切都很好:

struct compInt {
bool operator() (const int a, const int b) { return a < b; }
};

set<int,compInt> s1;

// Actually this is no good, but removing it would obfuscate
// the accepted answer:
set<int> s2(compInt);

[最后一个编译但它是一个函数声明, s2 原来不是一个容器]。

但我想这样做:
void func (____ x)
{
set<int> s(x);
}

我不想这样做:
template<typename C>
void func (C& c)
{
set<int> s(c);
}

function<bool(const int,const int)>不起作用。我试着制作 compInt::operator()虚拟的,所以我可以这样做:
void func (compInt& ci)

并传入派生对象,但实际上是 set<int> s(ci)然后无法编译(我几乎很感激,因为这是一个可怕的黑客攻击)。

最佳答案

set<int> s1(compInt);


这声明了一个返回类型为 set<int> 的函数。 .

set<int> s(x);


这声明了一个 set<int> 类型的局部变量。 .比较器类型不是从参数推导出来的,而是使用默认模板参数。因此, compInt不用作比较器,因此您不能传递 compInt 的实例给构造函数。

您可以使用:
void func (compInt x)
{
std::set<int,compInt> s(x);

I tried making compInt::operator() virtual so I could do this:

void func (compInt& ci)


多态比较器会很成问题。 Set 按值存储对象,因此通过引用传递给函数将无济于事。您需要使用类型删除:定义一个包装比较器,它将多态比较器作为构造函数参数,将其存储在动态存储中,并将调用运算符委托(delegate)给存储的多态比较器。然后使用包装类型作为集合的模板参数。

关于c++ - 比较函数对象的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60904207/

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