2015-06-01 14 views
7

Nếu đây là bản sao tôi xin lỗi. Tôi nhìn xung quanh và tìm thấy các vấn đề tương tự nhưng không có gì chính xác như thế này.Có thể trích xuất kích thước mảng từ đối số mẫu không?

Nếu tôi nhanh chóng một mẫu như vậy ...

MyClass<int[10]> c; 

Làm thế nào tôi có thể viết mẫu để có được quyền truy cập vào tất cả các loại và kích thước mảng? Tôi đã thử tất cả mọi thứ tôi có thể nghĩ và tôi không thể có được nó.

Tôi đã lấy cảm hứng từ mẫu std :: chức năng cho phép bạn sử dụng cú pháp tương tự như nguyên mẫu hàm, như ...

std::function<int(MyClass&)> myfunc; 

Vì vậy, tôi nghĩ rằng nó sẽ được tốt đẹp để có một cái gì đó tương tự cho mảng và kích thước của nó. Tôi có thể sử dụng bất kỳ tính năng C++ mới nhất nào (C++ 11/14).

+1

Tại sao bạn không sử dụng 'std :: array '? Thật tuyệt vời và bạn nên sử dụng nó ;-) – stefan

+0

@stefan: Vâng, tôi đang cố thêm một số đường cú pháp theo ngữ cảnh vào một lớp của tôi. Nó không có gì để làm với tôi bằng cách sử dụng mảng thực tế. – extracrispy

+0

Cú pháp đó là sử dụng hợp lệ duy nhất của lớp học của bạn, hay nó là một trường hợp đặc biệt? – Quentin

Trả lời

17

Bạn có thể thêm một đặc tả từng phần mà trông như thế này:

template <typename T, ptrdiff_t N> 
class MyClass<T[N]> 
{ 
}; 

Dưới đây là một demo.

+3

Downvoter, vấn đề với đoạn mã này là gì? – Pradhan

+0

Có vẻ ổn với tôi. – Quentin

+1

Đẹp! Cảm ơn bạn. Tôi đã có một thời gian khó khăn với cú pháp tôi không thể có được bất cứ điều gì làm việc. – extracrispy

2
template <typename T, typename = void> 
struct deduce 
{ 
}; 

template <typename T> 
struct deduce<T, 
    typename ::std::enable_if< 
    ::std::is_array<T>{} 
    >::type 
> 
{ 
    using value_type = 
    typename ::std::decay<decltype(::std::declval<T>()[0])>::type; 

    static constexpr auto size = sizeof(T)/sizeof(value_type); 
}; 
+0

Điều này có hoàn toàn quá mức không? – Quentin

+3

Vâng, chỉ cho một số loại. – user1095108

+3

"Overkill for variety". Tôi thích điều đó: p – Quentin

3
template<class Arr> 
struct array_size {}; 
template<class T, size_t N> 
struct array_size<T[N]>:std::integral_constant<std::size_t, N>{}; 
template<class Arr> 
struct array_element {}; 
template<class Arr> 
using array_element_t = typename array_element<Arr>::type; 
template<class T, size_t N> 
struct array_element<T[N]>{using type=T;}; 

bây giờ bạn có thể array_size<ArrType>{}array_element_t<ArrType> mà không cần giải nén các loại.

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