相关疑难解决方法(0)

如何删除类似const和非const成员函数之间的代码重复?

假设class X我想要返回内部成员的访问权限:

class Z
{
    // details
};

class X
{
    std::vector<Z> vecZ;

public:
    Z& Z(size_t index)
    {
        // massive amounts of code for validating index

        Z& ret = vecZ[index];

        // even more code for determining that the Z instance
        // at index is *exactly* the right sort of Z (a process
        // which involves calculating leap years in which
        // religious holidays fall on Tuesdays for
        // the next thousand years or so)

        return ret;
    }
    const …
Run Code Online (Sandbox Code Playgroud)

c++ const class code-duplication c++-faq

228
推荐指数
11
解决办法
3万
查看次数

如何正确实现自定义迭代器和const_iterators?

我有一个自定义容器类,我想写它iteratorconst_iterator类.

我之前从未这样做过,但我找不到合适的方法.关于迭代器创建的指导原则是什么,我应该注意什么?

我也想避免代码重复(我觉得const_iteratoriterator分享很多东西;应该是另一个子类吗?).

脚注:我很确定Boost有什么可以缓解的,但我不能在这里使用它,因为很多愚蠢的原因.

c++ iterator const-iterator

217
推荐指数
8
解决办法
17万
查看次数

如何避免这种重复

我有类似这样的代码:

#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";
};
Run Code Online (Sandbox Code Playgroud)

我想知道是否有简单的方法来避免get()函数中的代码重复?

c++ dry c++11

10
推荐指数
1
解决办法
563
查看次数

在C ++ 17中实现迭代器和const_iterator的正确方法是什么?

在实现自定义容器时,我到了需要实现迭代器的地步。当然,我不想为const和non-const迭代器编写两次代码。我发现了这个问题,详细说明了这样的可能实现:

template<class T>
class ContainerIterator {
    using pointer = T*;
    using reference = T&;
    ...
};

template<class T>
class Container {
    using iterator_type = ContainerIterator<T>;
    using const_iterator_type = ContainerIterator<const T>;
}

Run Code Online (Sandbox Code Playgroud)

但是,我也发现了这个这个问题,使用模板参数:

template<class T, bool IsConst>
class ContainerIterator {
    using pointer = std::conditional_t<IsConst, const T*, T*>;
    using reference = std::conditional_t<IsConst, const T&, T&>;
    ...
};

template<class T>
class Container {
    using iterator_type = ContainerIterator<T, false>;
    using const_iterator_type = ContainerIterator<T, true>;
}
Run Code Online (Sandbox Code Playgroud)

第一个解决方案似乎更容易,但是答案是从2010年开始。经过一些研究,似乎第一个版本并未得到广泛使用,但我不知道为什么。我觉得我缺少第一个版本的一些明显缺陷。


因此问题变为:

  1. 第一个版本有什么问题吗?

  2. 如果没有,为什么版本#2似乎是c ++ …

c++ c++17

7
推荐指数
1
解决办法
115
查看次数

在实现迭代器和const_iterator类时避免代码重复的最佳实践

在实现诸如iterator和/ const_iterator或类似的类对时避免代码重复的最佳实践是什么?

  • 是否通常使用大量const_casts在const_iterator方面实现迭代器?
  • 是否使用某种traits类并最终将iterator和const_iterator定义为公共模板的不同实例?

这似乎是一个普遍的问题,有一个规范的解决方案,但我没有找到任何专门的文章.

c++ class-design const code-duplication

6
推荐指数
1
解决办法
245
查看次数

避免使用auto关键字复制const和非const的代码?

好的,我做了一些研究,显然在这个主题上有很多关于SO的重复问题,仅举几例:

但是我忍不住再提一下,因为

  1. 使用 auto -typed返回值,我实际上是复制函数体,唯一的区别是const函数限定符.
  2. 这是可能的const版本和非const版本可能返回彼此完全不相容的类型.在这种情况下,斯科特迈耶斯的const_cast习语,以及"非const功能返回非const"技术都不会起作用.

举个例子:

struct A {
    std::vector<int> examples;
    auto get() { return examples.begin(); }
    auto get() const { return examples.begin(); }
};  // Do I really have to duplicate?
    // My real-world code is much longer
    // and there are a lot of such get()'s
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,auto get()返回一个iteratorwhile auto get() const返回一个const_iterator,并且两个不能相互转换(我知道erase(it,it) …

c++ c++14

6
推荐指数
1
解决办法
851
查看次数