sky*_*ack 16
以下是原始数组的可能实现:
#include<functional>
template<std::size_t... I, std::size_t N>
constexpr auto f(const int (&arr)[N], std::index_sequence<I...>) {
return std::make_tuple(arr[I]...);
}
template<std::size_t N>
constexpr auto f(const int (&arr)[N]) {
return f(arr, std::make_index_sequence<N>{});
}
int main() {
constexpr int arr[] = { 0, 1, 2 };
constexpr auto tup = f(arr);
static_assert(std::get<0>(tup) == 0, "!");
static_assert(std::get<1>(tup) == 1, "!");
static_assert(std::get<2>(tup) == 2, "!");
}
Run Code Online (Sandbox Code Playgroud)
constexpr
可以在编译时推导出数组的大小,因此您不必明确指定它.
该大小可以在内部用于创建一组索引,以便从数组中获取元素并动态创建元组.
正如评论中所提到的,如果你想进一步概括并接受原始数组和std::array
s,你可以这样做:
#include<functional>
#include<array>
template<std::size_t... I, typename U>
constexpr auto f(const U &arr, std::index_sequence<I...>) {
return std::make_tuple(arr[I]...);
}
template<typename T, std::size_t N>
constexpr auto f(const T (&arr)[N]) {
return f(arr, std::make_index_sequence<N>{});
}
template<typename T, std::size_t N>
constexpr auto f(const std::array<T, N> &arr) {
return f(arr, std::make_index_sequence<N>{});
}
int main() {
constexpr int arr1[] = { 0, 1, 2 };
constexpr auto tup1 = f(arr1);
static_assert(std::get<0>(tup1) == 0, "!");
static_assert(std::get<1>(tup1) == 1, "!");
static_assert(std::get<2>(tup1) == 2, "!");
constexpr std::array<int, 3> arr2 = { 0, 1, 2 };
constexpr auto tup2 = f(arr2);
static_assert(std::get<0>(tup2) == 0, "!");
static_assert(std::get<1>(tup2) == 1, "!");
static_assert(std::get<2>(tup2) == 2, "!");
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
997 次 |
最近记录: |