是否可以用一个定义同时定义函数的 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;
}
假设我正在为单向链表编写迭代器和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;
}