使用模板化函数减少代码

时间:2015-08-01 05:12:24

标签: c++ oop

我有两个具有类似功能的模板化函数(重载),除了函数体中的一行差异和一个额外的函数参数。    是否可以进一步组合这些功能以避免重复代码

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

5 个答案:

答案 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;
}