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

Template or function overload for generic argument

本文关键字:函数 重载 参数 泛型      更新时间:2023-10-16

我有一个函数,它接受三个参数

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

我的问题是我想重写的第二个参数,使其可以是字符串或Path对象(来自Boost文件系统库,但实际上任何可以被视为字符串的对象都应该这样做),这样我就不必到处将路径转换为字符串。

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

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

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

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

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

更复杂的是,将来我可能想扩展函数,使其也可以使用一组字符串或一组路径,而不是仅使用一个字符串/路径作为第二个参数。

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

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

我通常遵循以下规则:

  • 如果您想对不同的数据类型执行相同的操作,请选择模板。

  • 如果您想对不同的数据类型执行的不同操作,则更喜欢函数重载。

您的用例属于第二类。

为什么不制作一个类似的函数

void replace(const string s, const path p, string* ss) {
    replace(s, convert_to_string(path), ss);
}

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