泛型参数的模板或函数重载
Template or function overload for generic argument
我有一个函数,它接受三个参数
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);
}
让优化器决定应该如何处理。它有什么不优雅的地方?你的模板方法也会做同样的事情,只是会更复杂。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载