【问题标题】:Why does basic_istream_view inherit view_interface?为什么basic_istream_view继承view_interface?
【发布时间】:2021-11-17 01:43:20
【问题描述】:

basic_istream_view 是 C++20 中的一个简单的input_range,只有一个begin()end() 函数:

template<movable Val, class CharT, class Traits>
  requires default_­initializable<Val> &&
           stream-extractable<Val, CharT, Traits>
class basic_istream_view : public view_interface<
                                    basic_istream_view<Val, CharT, Traits>> { 
 public:
  constexpr iterator begin();
  constexpr default_sentinel_t end() const noexcept;
};

它继承了view_interface,在[view.interface]中定义为:

template<class D>
class view_interface {
 public:
  constexpr bool empty() requires forward_­range<D>;

  constexpr explicit operator bool()
    requires requires { ranges::empty(derived()); };

  constexpr auto data() requires contiguous_­iterator<iterator_t<D>>;

  constexpr auto size() requires forward_­range<D>;

  constexpr decltype(auto) front() requires forward_­range<D>;
  constexpr decltype(auto) back() requires bidirectional_­range<D>;

  template<random_­access_­range R = D>
  constexpr decltype(auto) operator[](range_difference_t<R> n);
};

可以看到view_interface的几乎所有成员函数都要求Dforward_range,而operator bool()要求ranges::empty(derived())是良构的,这也要求Dforward_range .

似乎basic_istream_view 继承view_interface 的唯一目的是为view 建模,因为view 需要view_baseview_interface 被继承。

但是如果你想让basic_istream_view 成为一个视图,为什么不直接从view_base 继承呢?除了模板实例化的成本之外,我看不到继承 view_interface 的任何好处。

那么,为什么basic_istream_view 继承view_interface 而不是view_base?有历史原因吗?

【问题讨论】:

  • 在我看来,它通过 CRTP 为成员函数提供了合适的实现。另请注意 DR LWG 3549:“view_interface 需要从 view_base 派生,这有时需要在一个视图中包含多个 view_base 子对象。”。此继承现已从标准中删除
  • "这背后的考虑是什么?" 我不太明白你的问题。这是一个视图。视图应该继承自view_interface。你还需要什么“注意事项”?
  • @Nicol Bolas。我的意思是“为什么 basic_istream_view 继承 view_interface 而不是 view_base?
  • 我的问题是……为什么不应该呢?也就是说,仅仅因为成员函数不可用并不意味着从它继承是不合适的。
  • @NicolBolas。我明白你的意思。在我看来,简单地继承view_base似乎是一个更好的选择,但这可能只是我的片面之词,谢谢您的不吝赐教。

标签: c++ c++20 std-ranges


【解决方案1】:

仅仅因为今天view_interface 的成员函数都需要前向范围并不意味着我们将来永远不会添加也可以在输入范围上工作的成员函数。

还有,为什么不呢?

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 2023-03-20
    • 2014-08-26
    • 2010-12-07
    • 2015-04-28
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多