c++ - 如何更好地设计两个重载函数相似

标签 c++ design-patterns

我正在做一个 C++ 项目,我有一个案例如下:

void func(int a, int b)
{
    if (some_bool)
    {
        generateString(generateFunc()); // different
    }
    for (auto it : myVector)
    {
        // do something
        for (int i = 0; i < a + b; ++i)
        {
            if (some_bool2)
            {
                myData = generateInt();
            }
            else
            {
                myData2 = generateInt2(); // different
            }
        }
    }
}


void func(int a, int b, string str)
{
    if (some_bool)
    {
        generateString(generateFunc(str));  // different
    }
    for (auto it : myVector)
    {
        // do something
        for (int i = 0; i < a + b; ++i)
        {
            if (some_bool2)
            {
                myData = generateInt();
            }
            else
            {
                myData2 = convertStrToInt(str);  //different
            }
        }
    }
}

如你所见,我有两个重载函数。
它们的逻辑结构相同,但有些细节不同。

我正在考虑是否有某种技术可以合并它们,以便我可以有更好的设计。因为现在如果我需要做一些改变,我必须改变两次。

最佳答案

您可以使用模板并执行如下操作:

template<typename F, typename... A>
void func(int a, int b, F &&f, A&&... a)
{
    if (some_bool)
    {
        generateString(generateFunc(std::forward<A>(a)...));  // different
    }
    for (auto it : myVector)
    {
        // do something
        for (int i = 0; i < a + b; ++i)
        {
            if (some_bool2)
            {
                myData = generateInt();
            }
            else
            {
                myData2 = std::forward<F>(f)(std::forward<A>(a)...);  //different
            }
        }
    }
}

然后按如下方式调用您的函数:

func(0, 0, generateInt2);

// or

func(0, 0, convertStrToInt, std::string{0});

关于c++ - 如何更好地设计两个重载函数相似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40557225/

相关文章:

c++ - 在不违反严格的别名规则的情况下调用 FFTW 的就地实数到复数转换

c++ - 什么是 boost 序列化 map 加载时间?

python - 如何在 Python 中创建不立即求值的符号函数执行 DAG?

c++ - 与 get_instance() 分离的单例构造函数

c# - 通用实现,但构造函数参数取决于具体类

c# - 如何在 MVP 被动 View 中显示复杂数据

c++ - 创建对象时得到 "undefined reference error"

C++ 如何使我的程序不会删除正在使用的文件?

c++ - wxWidget构建问题

c# - 业务逻辑层和数据访问层 : circular dependency