我有类似这样的C++类:
class A{
std::string str;
public:
A(std::string &str) : str(str){}
int cmpAt(const std::string &key) const{
return str.cmp(key);
}
int cmpAt(const char *key) const{
return str.cmp(key);
}
}
Run Code Online (Sandbox Code Playgroud)
两种cmpAt方法看起来都一样.有没有办法不复制方法?或许有template?
你应该写一个函数模板:
template <typename K>
int cmpAt(K const& key) const {
return str.compare(key);
}
Run Code Online (Sandbox Code Playgroud)
这样,如果你cmpAt用a 调用const char*,就可以避免必须构建额外的开销std::string.
编辑没关系,你运气不好:
Run Code Online (Sandbox Code Playgroud)int compare(const charT* s) const;5 返回:
compare(basic_string(s)).
所以只需删除const char*重载 - 它不会为重载提供任何额外的价值std::string const&.你必须编写自己的compare函数来避免额外的string构造函数,此时它不再是代码重复.
我会使用boost::string_ref或你最喜欢的其他实现
class A{
std::string str;
public:
A(std::string &str) : str(str){}
int cmpAt(const boost::string_ref &key) const{
return key.compare(str) * -1;
}
}
Run Code Online (Sandbox Code Playgroud)
这不会创建临时字符串,您可以传递字符串文字和std::string.