Chuyên môn của std::tuple_size
và std::tuple_element
có được phép cho các loại tùy chỉnh không? Tôi cho là vậy, nhưng tôi muốn hoàn toàn chắc chắn, và tôi không thể tìm thấy bất kỳ thông tin cụ thể nào.C++: Có thể std :: tuple_size/tuple_element được chuyên môn hóa không?
Ví dụ (không gian tên, chức năng thành viên và get<I>
quá tải bỏ qua):
template <typename T, size_t N>
struct vector { T _data[N]; };
template<size_t I, typename T, size_t N>
constexpr T& get(vector<T,N>& vec) { return vec._data[I]; }
namespace std {
template<typename T, size_t N>
class tuple_size< vector<T,N> > : public std::integral_constant<size_t, N> { };
template<size_t I, typename T, size_t N>
class tuple_element< I, vector<T,N> > { public: using type = T; };
}
Tôi cần điều đó để sử dụng với các ràng buộc có cấu trúc:
void f(vector<T,3> const& vec)
{
auto& [x,y,z] = vec;
// stuff...
}
Lưu ý rằng làm như vậy là bắt buộc trong C++ 1z để sử dụng tính năng kết buộc có cấu trúc 'auto [a, b, c]' mới. – Yakk