C++11重载函数代码复用:合并相同实现的两个重载方法
解决C++11中左值/右值引用重载代码重复的问题
这问题我太熟悉了!你现在因为要处理std::string的左值和右值,写了两个实现完全一样的重载函数,想合并成一个避免重复代码对吧?给你几个C++11里可行的方案:
方案一:直接传值(最简洁)
如果你的业务逻辑不需要修改原参数,或者修改副本也没问题,直接传值是最简单的写法:
#include <iostream> #include <string> void overloaded_function(std::string param) { // 这里写你原来的someStuffHere逻辑 std::cout << param << std::endl; }
为什么可行?
- 当传入左值(比如一个已存在的
std::string变量)时,会调用std::string的拷贝构造函数创建param; - 当传入右值(比如临时字符串、
std::move后的变量)时,会调用移动构造函数,代价极低; - 你只需要维护一份函数实现,完美解决重复问题。
方案二:万能引用(保持参数的引用属性)
如果你需要保持对原参数的引用(比如要修改原对象,或者不想承担拷贝成本),可以用C++11引入的万能引用(Universal Reference)结合模板:
#include <iostream> #include <string> template<typename T> void overloaded_function(T&& param) { // 这里写你原来的someStuffHere逻辑 // 如果需要保留参数的值类别(左值/右值),可以用std::forward<T>(param)传递给其他函数 std::cout << param << std::endl; }
进阶:限制只接受std::string类型
上面的模板会匹配所有类型,如果你只想让它处理std::string的左值/右值,可以用C++11的std::enable_if加类型约束:
#include <iostream> #include <string> #include <type_traits> template<typename T> typename std::enable_if< std::is_same<typename std::decay<T>::type, std::string>::value >::type overloaded_function(T&& param) { // someStuffHere逻辑 std::cout << param << std::endl; }
这样就不会意外匹配到其他类型的参数了。
怎么选?
- 如果逻辑只是读取参数,或者允许修改副本,优先选方案一,代码最简洁易读;
- 如果必须操作原参数(比如修改左值、或移动右值的资源),就用方案二的万能引用。
内容的提问来源于stack exchange,提问作者greywolf82
相关产品推荐
相关产品推荐

