假设我正在编写一个单链路列表的迭代器和const_iterator。
假设我有一个下面的类。
template <typename T>
struct Node
{
T value;
Node* next;
}
template <typename T>
struct NodePtr
{
private:
Node<T>* node;
public:
T& operator*() { return node->value; }
const T& operator*() const { return node->value; }
// Ommitted increment, comparison and so on...
}
class Iterator<T, bool isConst>
{
private: NodePtr<T> nodePtr;
using Reference = std::conditional_t<isConst, const T&, T&>;
Reference operator*() { return *nodePtr; }
const Reference operator*() const { return *nodePtr; }
// Ommited
}
我的问题是,是否可以用某种方式来替换这几行字
Reference operator*() { return node->value; }
const Reference operator*() const { return node->value; }
用一个单一的定义(也许使用模板参数isConst),并由编译器推导出const指定器?我想在isConst = true时让*成为const T&operator*()const,并在isConst = false时有两个版本。这可能吗?如果可以,那么该如何做呢?
我不认为有办法只写一次函数。大多数事情你都可以用自动和模板来做,但问题在于 const
函数本身的指定符。我不知道如何在任何形式下使之成为条件。你可以让它总是const,然后把 nodePtr
可变的,但这有点违背了整个事情的意义。你可以做的是停用非const超载的 const_iter
具体做法如下
template<bool tmp = isConst, std::enable_if_t<!tmp, char> = 0> // you need the tmp so that the enable_if is dependent
Reference operator*() {
return *nodePtr;
}