减少使用模板化函数的代码
reducing code using templated functions
我有两个模板化函数(重载),除了函数体中的一行差异和一个额外的函数参数之外,具有类似的功能。是否有可能进一步组合这些函数以避免重复代码
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;
}
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;
}
将函子参数调整为taste。并且可能提供一些方便的函函数(例如,其构造函数接受一个值,并在调用时将该值分配给传入的参数)。
如果不想更改接口,只需将function1
设置为调用此函数的单行函数
您可以给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;
}
这样,您可以使用两个或三个参数调用函数,但代码将能够判断提供了多少个参数。您可能需要为默认参数选择一个不同的值,这取决于您的情况。
是否可以进一步合并这些函数以避免重复代码
我想这就是你要找的。
// 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;
}
一种可能的方法是:
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;
}
感谢大家的回复。这是我最后使用的解决方案。
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;
}
相关文章:
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 是否可以像这样编写c malloc函数代码
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何将C++ lambda 函数代码转换为 C#?
- 该构造函数代码如何将指针作为参数
- 调用C++具有复杂参数和复杂返回类型的函数 C 代码
- "_FCbuild"不能用作函数 - C/C++ 代码错误
- 复制赋值和复制构造函数(代码C++的差异)
- 反向链表的递归函数(代码段说明)
- 当满足条件时,是否可以在 GLSL 着色器中回调 C/C++ 函数/代码
- 在构造函数代码之前禁用默认类成员初始化
- 以下移动构造函数代码安全吗?
- C++构造函数代码..这叫什么
- 如何更改SWIG生成的CSHARP文件中的构造函数代码
- 找不到当前函数(代码::块)C++的边界
- 使用模板进行 C++ 函数代码泛化
- 编写此指针函数代码的长格式方法是什么
- C++某些构造函数代码之间的区别
- 错误C2668从站点对重载函数代码的调用不明确http://h264bitstream.sourceforge.net/