如果两个重载函数相似,如何进行更好的设计

How to make a better design if two overload functions are similar

本文关键字:何进行 更好 相似 函数 重载 两个 如果      更新时间:2023-10-16

我正在做一个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});