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

3
我需要创建10个函数,这些函数非常长,并且在每个函数中除了一行代码之外完全相同。这一行代码是一个函数调用。 有没有办法将它们合并成一个函数? 例如:
int doSomethingOne()
{
...
one();
...
}

int doSomethingtwo()
{
... // same as one
two();
... // same as one
}

1
请您能否详细说明一下? - undefined
1
有没有办法... 如果没有办法,程序员们会放弃C++,转而使用其他编程语言。你应该创建一个单一的函数,删除那一行代码,并研究如何传递可调用对象,以便单一函数知道如何调用可调用对象。这基本上就是@user4581301建议的,但实现第一个评论中提出的总体思路有多种方法。 - undefined
1
在寻找一个重复的东西。非常简单的例子:https://godbolt.org/z/YTfTvqc7K - undefined
听起来你应该将所有相同的代码抽象成一个新的函数,这样你的10个函数就变成了对共享函数的一次调用,然后再加上一行新的代码。这样,你的10个函数就只有2行代码,应该是可以处理的。 - undefined
@JesperJuhl 不完全准确,这个函数有点复杂。我的“10个函数”在一个循环中被调用了x次,并且每个返回值都被推入一个向量中。你的建议只会节省几行代码。TedLyngmo的解决方案非常有帮助,但我想知道是否有一种方法可以对成员函数做同样的操作。 - undefined
显示剩余4条评论
2个回答

5
你可以创建一个函数模板,处理所有常见的部分,并在其中调用用户提供的函数。
#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
请注意,每次实例化模板时,doSomething函数模板的代码将在内存中重复。如果你想避免这种情况,可以移除模板,并将doSomething改为接受std::function或普通函数指针作为参数,这样内存中只会有一个doSomething的副本。 - undefined
1
@RemyLebeau 可能会有多个实例。我刚刚移除了它们,现在只剩下一个 :-) - undefined
1
@quant 当然可以:示例 - undefined
@TedLyngmo 任何无法复制的函数都可以用lambda包装起来,以便转发参数,所以这不是一个大问题。标准库也在各个地方接受函数对象的值。目前,你需要为左值函数指针、右值函数指针和左值函数分别实例化三个doSomething(都指向同一个函数)。如果你的目标是减少实例化,那么转发引用应该是首先要替换的东西。 - undefined
这仍然是一个不错的解决方案,我并不想对此过多纠结。对我来说,这只是一个奇怪的设计,仅此而已。 - undefined
显示剩余5条评论

1
你可以创建子函数,这样就可以避免重复的代码。
Data preamble()
{
    // ...
}
void postamble(Data& data)
{
    // ...
}

int doSomethingOne()
{
    auto data = preamble();
    one();
    postamble(data);
}

int doSomethingtwo()
{
    auto data = preamble();
    two();
    postamble(data);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接