std::ranges::view_interface<D>::data
From cppreference.com
< cpp | ranges | view interface
| constexpr auto data() requires std::contiguous_iterator<ranges::iterator_t<D>>; |
(1) | (C++20以降) |
| constexpr auto data() const requires ranges::range<const D> && |
(2) | (C++20以降) |
data() メンバ関数のデフォルト実装は、ビューが空でない場合に、派生型ビューが参照する連続ストレージの最も低いアドレス(contiguous_iterator から推測される)を取得するため、std::to_address を介して先頭イテレータが示すアドレスを取得します。
2) (1) と同じですが、
derived は static_cast<const D&>(*this) です。目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
先頭イテレータが示すアドレス。
[編集] 注記
以下の派生型は data() のデフォルト実装を使用できます。
- std::ranges::common_view
- std::ranges::drop_view
- std::ranges::drop_while_view
- std::ranges::ref_view
- std::ranges::subrange
- std::ranges::take_view
- std::ranges::take_while_view
std::ranges::view_interface から派生し、独自の data() メンバ関数を宣言していませんが、イテレータ型が contiguous_iterator を満たさないため、デフォルト実装を使用できません。
- std::ranges::basic_istream_view
- std::ranges::elements_view
- std::ranges::filter_view
- std::ranges::iota_view
- std::ranges::join_view
- std::ranges::lazy_split_view
- std::ranges::reverse_view
- std::ranges::split_view
- std::ranges::transform_view
[編集] 例
このコードを実行
#include <array> #include <iostream> #include <ranges> #include <string_view> int main() { constexpr std::string_view str { "Hello, C++20!" }; std::cout << (str | std::views::drop(7)).data() << '\n'; constexpr static std::array a { 1,2,3,4,5 }; constexpr auto v { a | std::views::take(3) }; static_assert( &a[0] == v.data() ); }
出力
C++20!
[編集] 関連項目
| (C++17) |
背後にある配列へのポインタを取得する (function template) |
| (C++20) |
連続rangeの先頭へのポインタを取得する (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
読み取り専用の連続rangeの先頭へのポインタを取得する (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
ポインタライクな型から生のポインタを取得します (関数テンプレート) |