我有类似的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);
}
}
两种cmpAt
方法看起来都一样。有没有办法不复制方法?也许是template
?
答案 0 :(得分:8)
你应该写一个功能模板:
template <typename K>
int cmpAt(K const& key) const {
return str.compare(key);
}
这样,如果您使用cmpAt
致电const char*
,则可以避免必须构建额外std::string
的开销。
编辑没关系,你运气不好:
int compare(const charT* s) const;
5 返回:
compare(basic_string(s))
。
因此,只需删除const char*
重载 - 它就不会为std::string const&
重载提供额外的价值。您必须编写自己的compare
函数以避免额外的string
构造函数,此时它不再是代码重复。
答案 1 :(得分:5)
我会使用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;
}
}
这不会创建临时字符串,您可以传递字符串文字和std::string
。
答案 2 :(得分:4)
使用int cmpAt(const std::string &key)
调用const char*
时,密钥将使用const char*
构建。所以你只需删除cmpAt(const char *key)
。
答案 3 :(得分:0)
正如其他人正确指出的那样,在您的具体情况下,不需要非const
比较功能。
但是,在一般情况下,您可以执行以下操作:
RetType someMethod(params...) const {
return LongAndComplexComputation(params, ...);
}
// Return type deduction is C++14.
// If you can't use C++14, only C++11, the return type should be:
// const std::remove_reference<decltype(*this)>::type *
auto cthis() const {
return this;
}
RetType someMethod(params...) {
return cthis()->someMethod(params, ...)
}
如果有必要,您必须使用const
从退货类型(例如,当您在*this
内返回指针时)抛弃const_cast
- 资格。