将函数作为参数传递以避免重复代码
Passing functions as arguments to avoid repeating code
到目前为止,我一直在用 C++11 编码,我试图了解自动在较新版本中的工作原理。特别是我有两个函数(示例中的 f1 和 f2(适用于给定的结构。这两个函数几乎相同,但它们会根据它们正在操作的成员而变化,有时操作是一个值的倒数,等等......(这个例子是对真实程序的过度简化(。
我想避免使用条件和重载函数来实现此行为。你知道一个更干净,或更惯用的方法吗?这段代码中是否有我遗漏的任何问题?
typedef struct thing_t {
double A;
double B;
} THING;
double get_A(const THING &t) {
return t.A;
}
double get_B(const THING &t) {
return t.B;
}
double convert(const THING &t, auto first, auto then) {
return first(t) / then(t);
}
double f1(const THING &t) {
return convert(t, get_A, get_B);
}
double f2(const THING &t) {
return convert(t, get_B, get_A);
}
int main() {
THING t = {1.0, 2.0};
std::cout << f1(t) << std::endl;
std::cout << f2(t) << std::endl;
return 0;
}
非常感谢您抽出宝贵时间审查我的问题。
首先,您还不能采用auto
函数参数。这是非标准C++。此外,这typedef struct
的东西是C主义。在C++中,只需:
struct thing_t {
double A;
double B;
};
现在让我们谈谈概括。convert
需要知道它的论点吗?也许它本身是一个高阶函数:
template <typename F, typename G>
auto convert(F f, G g) {
return [=](auto const& x) { return f(x) / g(x); }
}
然后get_A
和get_B
只是返回成员。我们已经有一个语法:指向成员数据的指针(不幸的是,它们不能直接调用,因此您需要std::mem_fn
(:
double f1(const thing_t& t) {
return convert(std::mem_fn(&thing_t::A), std::mem_fn(&thing_t::B))(t);
}
C++17 引入了std::invoke
,因此您可以在此处使实用程序功能更加用户友好。它可以在 C++14 中实现,但它可以让您编写:
template <typename F, typename G>
auto convert(F f, G g) {
return [=](auto const& x) { return std::invoke(f, x) / std::invoke(g, x); };
}
double f1(const thing_t& t) {
return convert(&thing_t::A, &thing_t::B)(t);
}
double f2(const thing_t& t) {
return convert(&thing_t::B, &thing_t::A)(t);
}
对此,你怎么看?
相关文章:
- 代码在main()中运行,但在函数中出现错误
- 为什么我在使用void函数时得到错误代码C2276
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 这个c++代码是如何在没有定义函数的情况下运行的
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 了解每月第一天函数的代码
- 代码的效率. 转到和函数调用
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 以下代码中的函数模板有什么问题?
- 为什么这些代码仍然使用 lvalue 函数?
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么下面带有非常量转换函数的代码没有歧义?
- C++代码停止工作错误使用cout内部函数
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 如何在c++中重用代码(函数)
- 编译来自学习现代 3D 图形编程的失败代码 函数___tmainCRTStartup中引用未解析的外部符号_main
- 混合代码-函数成员指针