有没有 "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