提问人:quant 提问时间:9/8/2023 更新时间:9/8/2023 访问量:100
C++ 如何简化仅在函数调用中不同的成员函数
C++ How to simplify member functions that only differ in function call
问:
我需要创建 10 个函数,这些函数很长,除了每个函数中的一行代码外,其他方面都相同。这行代码就是函数调用。 有没有办法浓缩成一个功能? 前任。
int doSomethingOne()
{
...
one();
...
}
int doSomethingtwo()
{
... // same as one
two();
... // same as one
}
答:
5赞
Ted Lyngmo
9/8/2023
#1
您可以创建一个函数模板来执行所有公共部分,并在所有这些部分中间调用用户提供的函数:
#include <iostream>
template <class Func>
int doSomething(Func&& func) {
// do all the common stuff before calling func
func();
// do all the common stuff after calling func
return 0;
}
void one() { std::cout << "One\n"; }
void two() { std::cout << "Two\n"; }
int doSomethingOne() { return doSomething(&one); }
int doSomethingtwo() { return doSomething(&two); }
int main() {
doSomethingOne();
doSomethingtwo();
doSomething(+[]{ std::cout << "Anything goes\n"; });
}
输出:
One
Two
Anything goes
评论
1赞
Remy Lebeau
9/8/2023
请注意,对于模板的每个实例化,函数模板的代码都将在内存中复制。如果要避免这种情况,请删除模板并 make take a or plain function 指针作为参数,这样内存中只有 1 个副本。doSomething
doSomething
std::function
doSomething
1赞
Ted Lyngmo
9/8/2023
@RemyLebeau 可能有多个实例化。我刚刚删除了它们,所以现在只有一个:-)
0赞
user4581301
9/8/2023
80年代闪回
0赞
Jan Schultke
9/8/2023
如果您要接受作为转发参考,您可能想要它。否则,您可以按值接受它。另外,真的有必要 lambda 吗?没有它它就可以工作。在我看来,这只是为时过早的(编译速度)优化,您应该保留原始版本,或者一路走来并使用函数指针。Func
std::forward
+
+
1赞
Ted Lyngmo
9/8/2023
@quant 当然:示例
1赞
Jarod42
9/8/2023
#2
[..]很长而且完全相同
您可以创建子函数,因此
Data preamble()
{
// ...
}
void postamble(Data& data)
{
// ...
}
int doSomethingOne()
{
auto data = preamble();
one();
postamble(data);
}
int doSomethingtwo()
{
auto data = preamble();
two();
postamble(data);
}
评论
std::function
int doSomething(void (*func)()) { ... func() ... }
doSomething(one);