我正在研究一个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
}
}
}
}
如您所见,我有两个重载功能
他们的逻辑结构是相同的,但有些细节不是。
我正在考虑是否有一些可以合并它们的技术,以便我可以有更好的设计。因为如果我需要做一些改变,现在我必须改变两次。
答案 0 :(得分:4)
您可以使用模板并执行以下操作:
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});