泛型参数的模板或函数重载

时间:2012-03-09 18:59:40

标签: c++ templates generic-programming

我有一个带三个参数的函数

void replace(const string, const string, string*) ;

我的问题是我要重写的第二个参数,所以它可以是一个字符串或一个Path对象(来自Boost Filesystem库,但实际上任何可被视为字符串的对象都应该这样做)所以我不必将路径转换为遍布整个地方的字符串。

我知道我可以重载函数并进行两个实现,这就是我现在所做的,所以我有两个相同函数的实现:

void replace(const string, const string, string*) ;
void replace(const string, const path, string*) ;

但这似乎并不优雅,即使第二个只是将路径转换为字符串并调用第一个(因此没有多少代码重复)。我尝试过使用模板,比如:

template <class T>
void replace(const string, const T, string*) ;

但是函数的实现要求它是一个字符串,所以如果给它一个路径,它需要转换为函数中的一个字符串,我不知道该怎么做,或者它是否是一个好的要做的事。

为了使问题更加复杂,将来我可能想要扩展该函数,因此它也可以采用一组字符串或一组路径,而不只是一个字符串/路径作为第二个参数。

处理这一切的最佳方法是什么?没有比拥有同一个函数的多个实现更好的方法吗?

2 个答案:

答案 0 :(得分:6)

重载函数是用例的最佳方法。

我通常遵循以下规则:

  • 如果您想在不同的数据类型上执行相同的操作,则更喜欢模板。

  • 如果您想在不同的数据类型上执行不同的操作,那么请选择函数重载。

您的用例属于第二类。

答案 1 :(得分:1)

为什么不做一个像:

这样的功能
void replace(const string s, const path p, string* ss) {
    replace(s, convert_to_string(path), ss);
}

让优化器决定它应该如何处理。什么不优雅呢?你的模板方法会做同样的事情,它会更复杂。