我有一些预定义的课程
class x
{
int y;
} xx;
class z
{
int y;
} zebra;
我希望将xx
或zebra
传递给函数,具体取决于几个条件
function(x xx) or function(z zebra)
由于"function"
的功能对于上述两者都相同,我如何编写一个可以同时使用xx
和zebra
的函数。我不被允许重新定义或宣布课程
答案 0 :(得分:3)
如果你需要像
这样的东西void add3(x xx)
{
xx.y += 3;
}
可用于课程z
,最好使用模板功能:
template<typename T>
void add3(T value)
{
value.y += 3;
}
另一个选择就是使用重载并定义两个函数:
void add3(x xx)
{
xx.y += 3;
}
void add3(z zebra)
{
zebra.y += 3;
}
如果两个类x
和z
在抽象方面有所不同,那么重载可能更好。
如果它们的抽象相同,它们应该基于共享接口(例如base
和y
字段,x
,z
都应该继承{{ 1}}然后你只有base
)。您可以在void add3(base b)
(http://www.cplusplus.com/reference/ios/)中看到此示例,其中输入和输出(std::ios
,std::istream
)都是流,但它们提供的功能完全不同实际使用情况。
另一方面,许多STL容器没有这种接口模式,因此模板解决方案并不总是坏主意。这只是你的风格和你正在使用的资源的问题。
答案 1 :(得分:2)
这取决于您在function
内需要做什么。
如果可以使用x
内的相同代码处理z
和function
,请将function
设为模板函数。
否则为function
制作两个重载,一个采用x
,另一个采用z
。