Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果两个过载功能相似,如何进行更好的设计 我正在研究一个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 } } } } void func(int a,int b) { 如果(一些布尔) { generateString(generateFunc());//不同 } 用于(自动it:myVector) { //做点什么 对于(int i=0;i_C++_Design Patterns - Fatal编程技术网

如果两个过载功能相似,如何进行更好的设计 我正在研究一个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 } } } } void func(int a,int b) { 如果(一些布尔) { generateString(generateFunc());//不同 } 用于(自动it:myVector) { //做点什么 对于(int i=0;i

如果两个过载功能相似,如何进行更好的设计 我正在研究一个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 } } } } void func(int a,int b) { 如果(一些布尔) { generateString(generateFunc());//不同 } 用于(自动it:myVector) { //做点什么 对于(int i=0;i,c++,design-patterns,C++,Design Patterns,如您所见,我有两个重载函数。 它们的逻辑结构相同,但某些细节不同。 我正在考虑是否有一些技术可以合并它们,这样我就可以有一个更好的设计。因为现在,如果我需要做一些更改,我必须更改两次。您可以使用模板并执行以下操作: template<typename F, typename... A> void func(int a, int b, F &&f, A&&... a) { if (some_bool) { generate

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


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

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

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

您可以将它们合并到一个函数中
void func(int a,int b,const string*str)
;按照惯例,如果
str
为空ptr,则属于第一种情况,如果
str
不是空ptr,则属于第二种情况。然后,您可以在函数中使用
if
来区分这两种情况。
func(0, 0, generateInt2);

// or

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