c – 如何避免这种重复

我有类似的代码
#include <string>

class A{
public:
    std::string &get(){
        return s;
    }

    const std::string &get() const{
        return s;
    }

    std::string &get_def(std::string &def){
        return ! s.empty() ? s : def;
    }

    // I kNow this might return temporary
    const std::string &get_def(const std::string &def) const{
        return ! s.empty() ? s : def;
    }

private:
    std::string s = "Hello";
};

我想知道有没有办法避免在代码重复的get()函数

解决方法

wandbox example

替代const_cast:创建一个静态模板函数,将*作为参考:

class A
{
private:
    template <typename TSelf,typename TStr>
    static auto& get_def_impl(TSelf& self,TStr& def)
    {
        return !self.s.empty() ? self.s : def;
    }

public:
    auto& get_def(std::string& str)
    {
        return get_def_impl(*this,str);
    }

    const auto& get_def(const std::string& str) const
    {
        return get_def_impl(*this,str);
    }
};

这是因为template argument deduction rules – 简而言之,TSelf将接受const和非const引用.

如果您需要访问get_def_impl内的成员,请使用self.member.

此外,您可以使用get_def_impl中的std ::条件或类似功能根据TSelf的常量来执行不同的操作.您还可以使用转发参考(TSelf&&&),并处理由于ref-qualifiersperfect-forwarding而被移动的情况.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...