【问题标题】:Boilerplate typedefs for STL-compatible containerSTL 兼容容器的样板类型定义
【发布时间】:2011-01-27 22:21:18
【问题描述】:

在标准库或 Boost 中,是否存在某种实用程序基类,用于使用所需的 typedef(size_type、value_type 等)填充自定义的 STL 兼容序列。我正在考虑类似boost::iterator_facade 的东西,但用于容器。

我打算自己卷起来,但想确保这样的东西不存在。

更新:

这是我想出的实用程序基类,以防有人发现它有用:

template <class C>
class ContainerAdapter
{
public:
    typedef C::value_type value_type;
    typedef C::reference reference;
    typedef C::const_reference const_reference;
    typedef C::const_iterator iterator;
    typedef C::const_iterator const_iterator;
    typedef C::difference_type difference_type;
    typedef C::size_type size_type;

protected:
    typedef C::container_type;
};


// Usage
class MyCustomContainer : public ContainerAdapter< std::vector<int> >
{
...
};

ContainerAdapter 只是“回显”自定义容器的底层容器的嵌套 typedef。真的没什么。

【问题讨论】:

  • 人们使用 value_type 和迭代器,因为它比替代品更容易,但我通常使用 value_type& 而不是引用,例如(并且 vector 是邪恶的)。您确定提供其他嵌套类型定义对您有利吗?通常我将项目传递给函数,无论如何它们将被绑定为 const&,并且永远不会触及嵌套的 const_reference typedef。
  • @Fred:我只是担心我的容器与 BOOST_FOREACH、boost 范围、std::back_insertion_iterator 等兼容。如果我只需要提供所有 typedef 的最小子集,我想知道哪个。我想实验和发现很容易。
  • 是的,但一般实用程序通常被编写为不可知的; 0x auto 非常适合。 :)
  • 这个问题让我产生了另一个相关的问题:stackoverflow.com/questions/4823761
  • 相关问题:stackoverflow.com/questions/1533917/c-template-macro-shortcut 我认为最好的解决方案可能是隐藏一个结构,就像该问题的答案一样,然后使用宏完成一系列 using 声明。跨度>

标签: c++ boost stl containers boilerplate


【解决方案1】:

即使它确实存在,您仍然需要typedef typename base::size_type size_type。 看来你不会有太多收获。

【讨论】:

  • 如果您希望 typedef 在类声明中可见,您只需要在派生类中重新 typedef。自定义容器的用户仍然会看到从基类继承的所有 typedef。这就是boost::iterator_facade 的工作原理。
  • @Emilie 我知道,但是假设对于容器,您必须提供运算符和其他将使用这些类型的东西。
  • @aaa:我总是可以使用TT&amp;const T&amp; 等。我真正需要的唯一类型定义(在声明中)是iteratorconst_iterator。但是,我承认从文档的角度来看,在成员函数声明中包含 referencevalue_type 等更漂亮。
  • 我尝试过自己滚动,但事情变得……一团糟。你说得对,我没有得到太多。
猜你喜欢
  • 2011-07-24
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多