1

假设我正在为单链表编写迭代器和 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 时拥有两个版本。可能吗?如果是 - 那么怎么做呢?

4

1 回答 1

3

我认为没有办法只编写一次函数。大多数事情你可以用 auto 和 templates 做,但问题是const函数本身的说明符。我知道没有办法以任何形式使其成为有条件的。你可以让它总是 const 然后是nodePtr可变的,但这会破坏整个事情的重点。您可以做的是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;
}
于 2020-05-31T21:34:24.090 回答