如果两个过载功能相似,如何进行更好的设计 我正在研究一个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});