是否可以用一个定义同时定义函数的 const 和常规版本? (使用模板、自动、decltype 等)

Is it possible to define both const and regular version of the function with a single definition? (using templates, auto, decltype, etc)

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

我认为没有办法只写一次函数。您可以使用 auto 和模板做的大多数事情,但问题是函数本身的 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;
}