namespace std {
template <class C>
constexpr auto data(C& c) -> decltype(c.data()); // (1) C++17
template <class C>
constexpr auto data(const C& c) -> decltype(c.data()); // (2) C++17
template <class T, std::size_t N>
constexpr T* data(T (&array)[N]) noexcept; // (3) C++17
template <class E>
constexpr const E* data(initializer_list<E> il) noexcept; // (4) C++17
}
概要
コンテナの要素が格納されたメモリ領域へのポインタを取得する。
戻り値
- (1), (2) :
return c.data();
- (3) :
return array;
- (4) :
return il.begin();
備考
- 機能テストマクロは
__cpp_lib_nonmember_container_access
で値は201411
<iterator>
ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる:
例
#include <vector>
#include <iostream>
void some_c_like_api_function(const int* arr, std::size_t arr_size)
{
std::cout << "array size:" << arr_size << " at " << static_cast<const void*>(arr) << std::endl;
}
int main()
{
int arr[4] = {};
some_c_like_api_function(std::data(arr), std::size(arr));
std::vector<int> v { 12 };
some_c_like_api_function(std::data(v), std::size(v));
}
16
#include <vector>
#include <iostream>
void some_c_like_api_function(const int* arr, std::size_t arr_size)
{
std::cout << "array size:" << arr_size << " at " << static_cast<const void*>(arr) << std::endl;
}
int main()
{
int arr[4] = {};
some_c_like_api_function(std::data(arr), std::size(arr));
std::vector<int> v { 12 };
some_c_like_api_function(std::data(v), std::size(v));
}
出力例
array size:4 at 0x7fff0833f980
array size:1 at 0x22e42b0
バージョン
言語
- C++17
処理系
- Clang: 3.6 ✅
- GCC: 6.1 ✅
- ICC: ??
- Visual C++: 2015 ✅