有没有"现代"的方法来避免这种代码重复

Nic*_*ick 1 c++ dry c++11

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

Bar*_*rry 8

你应该写一个函数模板:

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.


编辑没关系,你运气不好:

int compare(const charT* s) const;
Run Code Online (Sandbox Code Playgroud)

5 返回: compare(basic_string(s)).

所以只需删除const char*重载 - 它不会为重载提供任何额外的价值std::string const&.你必须编写自己的compare函数来避免额外的string构造函数,此时它不再是代码重复.


Joh*_*itb 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这不会创建临时字符串,您可以传递字符串文字和std::string.