我有两个具有类似功能的模板化函数(重载),除了函数体中的一行差异和一个额外的函数参数。 是否可以进一步组合这些功能以避免重复代码
template <class T> int MyClass::function1(string name, T& value)
{
// same lines
// if statement
// statement to execute
// else
// different line, calls another function
return 1;
}
template <class T> int MyClass::function1(string name, T& value,
T defaultValue)
{
// same lines
// if statement
// statement to execute
// else
// different line, assign default value to value
return 1;
}
答案 0 :(得分:1)
template <class T,class Func> int MyClass::function1(string name, T& value, Func fallback)
{
// same lines
if (condition) {
// statement to execute
} else {
fallback(value);
}
return 1;
}
调整仿函数参数。并且可能提供一些便利仿函数(例如,一个构造函数获取值,并且在调用时将该值赋给传入的参数)。
如果您不想更改界面,只需将function1
作为调用此功能的单行函数。
答案 1 :(得分:0)
是否可以进一步组合这些功能以避免重复代码
我认为这就是你要找的东西。
// Private function
template <class T> void MyClass<T>::common_function1(string name, T& value)
{
// same lines
}
// Private function
template <class T> void MyClass<T>::common_function2(string name, T& value)
{
// statement to execute
}
template <class T> int MyClass<T>::function1(string name, T& value)
{
common_function1(name, value);
if ( condition )
comon_function2(name, value);
else
// different line, calls another function
return 1;
}
template <class T> int MyClass<T>::function1(string name, T& value,
T defaultValue)
{
common_function1(name, value);
if ( condition )
comon_function2(name, value);
else
// different line, assign default value to value
return 1;
}
答案 2 :(得分:0)
一种可行的方法可能是:
template <class T> bool MyClass::commonfunction(string name, T& value)
{
// same lines
// if statement
// {
// statement to execute
// return true;
// }
// else
// return false;
}
template <class T> int MyClass::function1(string name, T& value)
{
if(!commonfunction(name, value))
{
// different line, calls another function
}
return 1;
}
template <class T> int MyClass::function1(string name, T& value, T defaultValue)
{
if(!commonfunction(name, value))
{
// different line, assign default value to value
}
return 1;
}
答案 3 :(得分:0)
您可以为defaultValue
提供默认参数:
template <class T> int MyClass::function1(string name, T& value,
T defaultValue = T() )
{
if (defaultValue == T() )
//Do something
else
//Do something else
return 1;
}
这样你可以使用两个或三个参数调用该函数,但代码将能够告诉我们提供了多少个参数。您可能需要为默认参数选择不同的值,具体取决于您的具体情况。
答案 4 :(得分:0)
感谢所有回复。 这是我最终使用的解决方案。
DefaultValue的地址是默认参数(T *)。在传递defaultValue的地址的地方,它被赋值给value参数。如果为默认值传递NULL,则调用另一个函数。
// declaration
template <class T> int MyClass::function(string name, T& value,
T *defaultValue = NULL);
// definition
template <class T> int MyClass::function(string name, T& value,
T *defaultValue)
{
// same lines
// if statement
// statement to execute
// else
{
// if default value pointer is passed, assign it to value, else call
// another function
if (defaultValue)
value = *defaultValue;
else
// call another function
}
return 1;
}