如果两个过载功能相似,如何做出更好的设计 [英] How to make a better design if two overload functions are similar

查看:94
本文介绍了如果两个过载功能相似,如何做出更好的设计的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个c ++项目,我有一个例子如下:

I'm working on a c++ project and I have a case as below:

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
            }
        }
    }
}

如你所见,我有两个重载功能。

他们的逻辑结构是一样的,但是一些细节不是。

As you see, I have two overloading functions.
Their logical structures are the same but some details are not.

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

I'm considering if there is some technique which can merge them so that I can have a better design. Because for now I have to change two times if I need to do some change.

推荐答案

你可以使用模板,做一些像这个:

You can use templates and do something like this:

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
            }
        }
    }
}

然后调用您的函数,如下所示:

Then call your function as it follows:

func(0, 0, generateInt2);

// or

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

这篇关于如果两个过载功能相似,如何做出更好的设计的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆