C++ 如何简化仅在函数调用中不同的成员函数

C++ How to simplify member functions that only differ in function call

提问人:quant 提问时间:9/8/2023 更新时间:9/8/2023 访问量:100

问:

我需要创建 10 个函数,这些函数很长,除了每个函数中的一行代码外,其他方面都相同。这行代码就是函数调用。 有没有办法浓缩成一个功能? 前任。

int doSomethingOne()
{
...
one();
...
}

int doSomethingtwo()
{
... // same as one
two();
... // same as one
}
C++ 函数 简化

评论

0赞 user4581301 9/8/2023
将指针传递到执行该专用操作的函数(或对 )的引用。例如:用std::functionint doSomething(void (*func)()) { ... func() ... }doSomething(one);
1赞 quant 9/8/2023
你能详细说明一下吗?
0赞 Red.Wave 9/8/2023
似乎是资源获取。您能否提供有关代码类似部分的更多详细信息?
1赞 PaulMcKenzie 9/8/2023
有没有办法。.如果没有办法,程序员就会离开C++,转向另一种语言。你应该做的是创建一个函数,删除那一行代码,并研究如何传递可调用对象,以便单个函数知道如何调用可调用对象。这基本上是@user4581301建议的,但有多种方法可以实现第一条评论中提出的总体想法。
1赞 user4581301 9/8/2023
正在寻找复制品。非常简单的示例:godbolt.org/z/YTfTvqc7K

答:

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 个副本。doSomethingdoSomethingstd::functiondoSomething
1赞 Ted Lyngmo 9/8/2023
@RemyLebeau 可能有多个实例化。我刚刚删除了它们,所以现在只有一个:-)
0赞 user4581301 9/8/2023
80年代闪回
0赞 Jan Schultke 9/8/2023
如果您要接受作为转发参考,您可能想要它。否则,您可以按值接受它。另外,真的有必要 lambda 吗?没有它它就可以工作。在我看来,这只是为时过早的(编译速度)优化,您应该保留原始版本,或者一路走来并使用函数指针。Funcstd::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);
}