2016-11-14 12 views
11

Chuyên môn của std::tuple_sizestd::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... 
} 

Trả lời

11

Chuyên Môn với nhiều loại người dùng định nghĩa nói chung là tốt, và luôn luôn có được. N4606, [namespace.std]/1:

Một chương trình có thể thêm một mẫu chuyên môn đối với bất kỳ thư viện mẫu tiêu chuẩn để không gian tên std chỉ nếu việc kê khai phụ thuộc vào một loại người dùng định nghĩa và tính chuyên môn đáp ứng yêu cầu tiêu chuẩn thư viện cho mẫu gốc và không bị cấm rõ ràng.

Đối tuple_size, các yêu cầu cho mẫu gốc được quy định tại [tuple.helper]/1:

Tất cả các chuyên ngành của tuple_size<T> phải đáp ứng các yêu cầu UnaryTypeTrait với một BaseCharacteristic của integral_constant<size_t, N> đối với một số N.

UnaryTypeTrait, đến lượt nó, trong [meta.rqmts]/1:

Một UnaryTypeTrait mô tả một tài sản của một loại. Nó sẽ là một mẫu lớp có một đối số kiểu mẫu và, tùy chọn, các đối số bổ sung giúp xác định thuộc tính đang được mô tả. Nó phải là DefaultConstructible, CopyConstructible và được công khai và rõ ràng, trực tiếp hoặc gián tiếp, từ BaseCharacteristic, là chuyên môn của mẫu integral_constant, với các đối số cho mẫu integral_constant được xác định bởi các yêu cầu cho thuộc tính cụ thể được mô tả. Các tên thành viên của BaseCharacteristic sẽ không bị ẩn đi và sẽ có sẵn một cách rõ ràng trong UnaryTypeTrait. Các yêu cầu của

tuple_element được quy định trong [tuple.helper]/6 và [meta.rqmts]/3, nhưng vì lợi ích ngắn gọn, tôi sẽ không đăng chúng ở đây. Đủ để nói rằng nó thực sự là hợp pháp để chuyên ...

+1

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

Các vấn đề liên quan