假设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) 我有一个自定义容器类,我想写它iterator和const_iterator类.
我之前从未这样做过,但我找不到合适的方法.关于迭代器创建的指导原则是什么,我应该注意什么?
我也想避免代码重复(我觉得const_iterator并iterator分享很多东西;应该是另一个子类吗?).
脚注:我很确定Boost有什么可以缓解的,但我不能在这里使用它,因为很多愚蠢的原因.
我有类似这样的代码:
#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()函数中的代码重复?
在实现自定义容器时,我到了需要实现迭代器的地步。当然,我不想为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年开始。经过一些研究,似乎第一个版本并未得到广泛使用,但我不知道为什么。我觉得我缺少第一个版本的一些明显缺陷。
因此问题变为:
第一个版本有什么问题吗?
如果没有,为什么版本#2似乎是c ++ …
在实现诸如iterator和/ const_iterator或类似的类对时避免代码重复的最佳实践是什么?
这似乎是一个普遍的问题,有一个规范的解决方案,但我没有找到任何专门的文章.
好的,我做了一些研究,显然在这个主题上有很多关于SO的重复问题,仅举几例:
但是我忍不住再提一下,因为
auto -typed返回值,我实际上是复制函数体,唯一的区别是const函数限定符.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) …