使用reinterpret_cast将const添加到模板类

时间:2013-04-03 18:42:10

标签: c++ reinterpret-cast

这是正确使用reinterpret_cast还是有更好的方法来解决问题。

Node<T>* front_;

Iterator<const T> GetConstIterator() const {
  return Iterator<const T>(reinterpret_cast<Node<const T>*>(front_));
}

Iterator<T> GetIterator() {
  return Iterator<T>(front_);
}

迭代器的构造函数定义为。

template<class T>
class Iterator {
  explicit Iterator(Node<T>* const node) : node_(node) {}
  ...
}

2 个答案:

答案 0 :(得分:0)

您需要使您的const版本的迭代器可以从非const节点构造。然后我会重写getter以更符合STL:

Iterator<const T> begin() const { return Iterator<const T>(front_); }
Iterator<T> begin() { return Iterator<T>(front_); }

您需要做的就是让第一个版本编译。由于Node<T>Node<const T>无关,因此投放无效。

答案 1 :(得分:0)

使用reinterpret_cast抛弃常量是违法的。你需要使用const_cast。您可以使用reinterpret_cast来添加常量,但const_cast对于未来的维护者来说更正确,更明显。

从§5.2.10重新解释演员表,第2页:

  

reinterpret_cast运算符不应丢弃constness(5.2.11)。   整数,枚举,指针或指向成员的指针的表达式   type可以显式转换为自己的类型;这样的演员收益率   其操作数的值。

实际上,Node<const T>的构造函数应该能够隐式执行此操作,甚至不需要强制转换。

模糊性来自你的功能:

Iterator<T> GetIterator() const {
  return Iterator<T>(front_);
}

您不应该返回一个可以将容器变为const方法的迭代器。此方法不应具有const限定符。

你应该只有:

Iterator<const T> GetIterator() const {
  return Iterator<const T>(front_);
}

Iterator<T> GetIterator() {
  return Iterator<T>(front_);
}