gpt4 book ai didi

c++ - 传递泛型函数以对同类类型进行操作

转载 作者:行者123 更新时间:2023-11-30 03:16:48 25 4
gpt4 key购买 nike

假设我有一个由同类类型组成的类:

struct Homog {
int a;
double b;
std::string c;
};

这是一个计算此类的两个实例的“逐元素最小值”1 的函数:

Homog min(const Homog& l, const Homog& r) {
return {
std::min(l.a, r.a),
std::min(l.b, r.b),
std::min(l.c, r.c),
};
}

很好。

现在我想计算 max 而不是 min。代码相同,但将 std::min 替换为 std::max。我不想复制它,而是希望有一个通用的“逐元素应用”方法,然后 min 和 max 只需使用适当的仿函数调用它:

Homog apply(const Homog& l, const Homog& r, ?? op) {
return {
op(l.a, r.a),
op(l.b, r.b),
op(l.c, r.c),
};
}

Homog min(const Homog& l, const Homog& r) {
return apply(l, r, std::min);
}

Homog max(const Homog& l, const Homog& r) {
return apply(l, r, std::max);
}

当然,上面的代码是行不通的,因为我不知道如何声明op。它不是普通的泛型仿函数对象,因为它需要处理不同的类型。

我可以做我想做的事,以某种方式传递一些内容,上面写着“为每个成员调用 op:别担心,它会为每种类型解析一些内容”?


也许在这里使用 min() 不是最好的名字,因为它的行为与总是返回两者之一的 std::min 不同给定对象:此方法返回一个新对象,该对象通常与两个输入中的任何一个都不相同,而是它们成员值的混合。

最佳答案

Of course, the above code doesn't work, because I don't know how to declare op. It is not a normal generic functor object, because it needs to work on different types.

通常使用带有模板 operator() 的函数来绕过这个问题。

从 C++14(引入通用 lambda 表达式)开始,简单如下

template <typename F>
Homog apply(const Homog& l, const Homog& r, F const & op) {
return {
op(l.a, r.a),
op(l.b, r.b),
op(l.c, r.c),
};
}

Homog min(const Homog& l, const Homog& r) {
return apply(l, r, [](auto const & a, auto const & b){ return std::min(a, b); });
}

关于c++ - 传递泛型函数以对同类类型进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55986995/

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