2013-12-10 14 views
7

Tôi đã nhìn vào chủ đề thú vị này: https://stackoverflow.com/a/16596463/2436175thông số mẫu mẫu với vùng chứa và phân bổ mặc định: tôi có thể khai báo gọn hơn không?

cụ thể mối quan tâm trường hợp của tôi định nghĩa một hàm templated sử dụng một container std của cv :: Point_ và cv :: Rect_ từ opencv. Tôi muốn template chống lại:

  • các loại container std tôi sẽ sử dụng
  • các kiểu dữ liệu cơ bản để hoàn thành định nghĩa của cv :: Point_ và cv :: Rect_

tôi đã kết thúc với miêu tả sau:

template <typename T, template <typename, typename> class Container_t> 
    void CreateRects(const Container_t<cv::Point_<T>,std::allocator<cv::Point_<T> > >& points, 
        const T value, 
        Container_t<cv::Rect_<T>,std::allocator<cv::Rect_<T> > >& rects) { 

    } 

mà biên dịch tốt với điều này:

void dummy() { 

const std::vector<cv::Point_<double> > points; 
std::vector<cv::Rect_<double> > rects; 
CreateRects(points,5.0,rects); 

} 

(Tôi cũng đã thấy rằng tôi cũng có thể sử dụng, ví dụ, CreateRects<double>(points,5,rects))

Tôi đã tự hỏi nếu có tồn tại cách nào để thực hiện kê khai của tôi nhỏ gọn hơn, ví dụ mà không cần phải chỉ định 2 lần cấp phát mặc định.

+1

Tại sao bạn muốn nhỏ gọn tuyên bố? Không có hiệu suất đạt được và thời gian tích lũy được lưu trong quá trình xây dựng, đã bị lãng phí bằng cách đăng lên StackOverflow. –

+2

@ThomasMatthews Nếu tôi có thể cải thiện khả năng đọc theo bất kỳ cách nào, nó có thể tiết kiệm thời gian cho mọi người (ngay cả bản thân tôi) phải đối phó với mã của tôi sau này. Nhưng bạn có một điểm. Đôi khi tôi chỉ đặt câu hỏi bởi vì tôi thấy chúng thú vị, và không nhất thiết phải hữu ích ngay lập tức. – Antonio

Trả lời

11

Bạn có thể thêm mô tả cho mẫu thông số của mẫu template tham số Container_t để mẫu hàm của bạn:

template 
    < 
     typename T, 
     template 
      < 
       typename U, 
       typename = std::allocator<U> 
      > 
     class Container_t 
    > 
void CreateRects 
    (
     const Container_t<cv::Point_<T> >& points, 
     const T value, 
     Container_t<cv::Rect_<T> >& rects 
    ) 
{ 

} 

Hoặc bạn có thể sử dụng C++ 11 mẫu variadic:

template 
    < 
     typename T, 
     template <typename...> class Container_t 
    > 
void CreateRects 
    (
     const Container_t<cv::Point_<T>>& points, 
     const T value, 
     Container_t<cv::Rect_<T>>& rects 
    ) 
{ 

} 
+0

Các công cụ tốt, cảm ơn bạn! Thực ra, bây giờ tôi nhận ra rằng câu trả lời cho câu hỏi của tôi đã có trong liên kết tôi đăng, tôi tự hỏi mình đã bỏ lỡ điều đó như thế nào! Câu trả lời của bạn thêm các mẫu variadic vào hình ảnh, vì vậy sau khi tất cả tôi vui mừng tôi đã hỏi :) – Antonio

+0

@Antonio Có một sự khác biệt nhỏ giữa 'template > class Container_t> void CreateRects (...); 'và' template > lớp Container_t> void CreateRects (...); '. Nhưng bạn nói đúng, giải pháp tương tự nằm trong liên kết của bạn. – Constructor

0

gì về việc đi với mã đơn giản như:

template <typename T, class C1, class C2> 
void CreateRects(const C1& points, 
       const T value, 
       C2& rects) { 

} 

Nó dễ dàng hơn để đọc, biên dịch, và nếu loại là không phù hợp, bạn sẽ nhận được một lỗi biên dịch.

+0

2 container chứa 2 loại đối tượng khác nhau (Point_ và Rect_ ), bạn có chắc là nó hoạt động không? Cố gắng, khá mong đợi tôi nhận được một lỗi 'lập luận/thay thế đối số thất bại',' loại trừ các loại xung đột cho tham số 'Container_t' (std :: vector > và std :: vector > ' – Antonio

+0

Không nhận thấy bạn đang sử dụng 2 thùng chứa. Tôi sẽ sửa lỗi này ... Đã sửa lỗi – egur

+0

Hmmmm ... Tôi đã từ chối tác phẩm này, nhưng tôi muốn kiểm soát nhiều hơn một chút, ví dụ: tôi muốn ép buộc rằng 2 container cùng loại (cả hai vectơ, hoặc cả hai danh sách) – Antonio

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