2013-08-21 32 views
6

Tôi muốn biết nếu có thể lọc các loại được chuyển đến mẫu variadic (dựa trên mẫu biến vị ngữ) để tạo một mẫu variadic khác chứa các kiểu thỏa mãn vị từ:Lọc các loại gói tham số

/** Filter a parameter pack */  
template <template <class> class, 
      template <class...> class, 
      class...> 
struct filter; 
template <template <class> class Pred, template <class...> class Variadic> 
struct filter<Pred, Variadic> : Variadic<> 
{}; 
template <template <class> class Pred, 
      template <class...> class Variadic, 
      class T, class... Ts> 
struct filter<Pred, Variadic, T, Ts...> 
{ 
    // FIXME: this just stops at first T where Pred<T> is true 
    using type = typename std::conditional< 
     Pred<T>::value, 
     Variadic<T, Ts...>, // can't do: Variadic<T, filter<...>> 
     filter<Pred, Variadic, Ts...> >::type; 
}; 

Như bạn có thể thấy, tôi chưa tìm thấy cách "trích xuất" gói tham số từ phần còn lại của các loại được lọc.

Cảm ơn trước!

Trả lời

6

Điều đó khá đơn giản. Tại trung tâm bạn nên có một cái gì đó như thế này:

template <typename...> struct filter; 

template <> struct filter<> { using type = std::tuple<>; }; 

template <typename Head, typename ...Tail> 
struct filter<Head, Tail...> 
{ 
    using type = typename std::conditional<Predicate<Head>::value, 
           typename Cons<Head, typename filter<Tail...>::type>::type, 
           typename filter<Tail...>::type 
          >::type; 
}; 

Bạn chỉ cần Cons<T, Tuple>, mà biến T, std::tuple<Args...> vào std::tuple<T, Args...>, và bạn cần phải vượt qua vị cùng (trái như một bài tập). Cons có thể trông như thế này:

template <typename, typename> struct Cons; 

template <typename T, typename ...Args> 
struct Cons<T, std::tuple<Args...>> 
{ 
    using type = std::tuple<T, Args...>; 
}; 

Kết quả của filter<Args...>::type sẽ std::tuple<Brgs...>, nơi Brgs... là một gói bao gồm chỉ có những loại trong Args... mà vị nắm giữ.

+0

Có điều tôi vẫn chưa hiểu, nhưng lỗi trình biên dịch không giúp ích gì. Tôi đã đăng ở đây http://ideone.com/USTnJR, nếu bạn không bận tâm đến việc xem xét khác - nó có vẻ không thích hợp để chỉnh sửa bản gốc. – scry

+0

Phiên bản đó có vấn đề khác, sử dụng phiên bản này: http://ideone.com/eh3Epd. Như bạn có thể thấy, các loại thành viên của bộ lọc và Nhược điểm không được công nhận là loại. – scry

+0

@roysc: 'Cons' phải chuyên về bộ dữ liệu. Hãy để tôi chỉnh sửa. [Edit:] Xong. Tôi cũng đã sửa đổi các mẫu chính để có một trường hợp cơ sở thích hợp. –