有没有 "modern" 方法来避免这种代码重复
Is there "modern" way to avoid this kind of code duplication
我有 C++ class 与此类似:
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
?
当用const char*
调用int cmpAt(const std::string &key)
时,将用const char*
构造密钥。所以你可以简单地删除 cmpAt(const char *key)
.
你应该只写一个函数模板:
template <typename K>
int cmpAt(K const& key) const {
return str.compare(key);
}
这样,如果您使用 const char*
调用 cmpAt
,则可以避免必须构造额外的 std::string
的开销。
编辑没关系,你运气不好:
int compare(const charT* s) const;
5 Returns: compare(basic_string(s))
.
因此只需删除 const char*
重载 - 与 std::string const&
重载相比,它不会为您提供额外的价值。您将不得不编写自己的 compare
函数来避免额外的 string
构造函数,此时它不再是代码重复。
正如其他人正确指出的那样,在您的特定情况下,不需要非 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, ...)
}
如有必要,您将不得不放弃 return 类型的 const
限定(例如,当您在 *this
中 returning 指针时),使用 const_cast
.
我会使用 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
。
我有 C++ class 与此类似:
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
?
当用const char*
调用int cmpAt(const std::string &key)
时,将用const char*
构造密钥。所以你可以简单地删除 cmpAt(const char *key)
.
你应该只写一个函数模板:
template <typename K>
int cmpAt(K const& key) const {
return str.compare(key);
}
这样,如果您使用 const char*
调用 cmpAt
,则可以避免必须构造额外的 std::string
的开销。
编辑没关系,你运气不好:
int compare(const charT* s) const;
5 Returns:
compare(basic_string(s))
.
因此只需删除 const char*
重载 - 与 std::string const&
重载相比,它不会为您提供额外的价值。您将不得不编写自己的 compare
函数来避免额外的 string
构造函数,此时它不再是代码重复。
正如其他人正确指出的那样,在您的特定情况下,不需要非 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, ...)
}
如有必要,您将不得不放弃 return 类型的 const
限定(例如,当您在 *this
中 returning 指针时),使用 const_cast
.
我会使用 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
。