是否有"现代"避免这种代码重复的方法

时间:2015-09-12 16:46:01

标签: c++ c++11 dry

我有类似的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

4 个答案:

答案 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 - 资格。