是否可以用一个定义同时定义const和普通版本的函数?(使用模板、auto、decltype等)

问题描述 投票:0回答: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时有两个版本。这可能吗?如果可以,那么该如何做呢?

c++ overloading const template-instantiation
1个回答
3
投票

我不认为有办法只写一次函数。大多数事情你都可以用自动和模板来做,但问题在于 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.