7

Có cách nào đơn giản để có các tham số mẫu mẫu của biến thể variadic variadic hay không. Ví dụ xem xét các chức năng chữ ký sauCác biến mẫu của mẫu biến thể Variadic variadic

template<template<typename,size_t...> class Pack, 
    typename T, size_t ... Args> 
void foo(const Pack<T,Args...>& a); 

Nếu chúng ta muốn vượt qua hai Pack s chúng ta phải bây giờ làm một tình trạng quá tải

template<template<typename,size_t...> class Pack, 
    typename T, size_t ... Args0, size_t ... Args1> 
void foo(const Pack<T,Args0...>& a, const Pack<T,Args1...>& b); 

Bây giờ những gì nếu chúng ta muốn vượt qua một số biến của các đối tượng của Pack với các tham số variadic khác nhau Args0...,Args1...,Args2....

Vì vậy, tôi đã suy nghĩ nếu có một cách thực tế để làm một cái gì đó dọc theo dòng (sau đây chắc chắn là một đại diện phác thảo).

template<template<typename,size_t...> ... class Pack, typename T,...> 
void foo(const Pack<T,...> ... packs); 
+0

Bạn cần làm gì với 'T' và' Args'? Có lẽ bạn nên sử dụng 'template ' và viết một số đặc điểm đơn giản để trích xuất những gì bạn cần. – TartanLlama

+0

..... lol .....? : D –

+0

@Klaus thực sự, có bạn có thể ... [Xem cho chính mình] (http://coliru.stacked-crooked.com/a/1d822071ce2130bf) – Rerito

Trả lời

5

tôi sẽ chỉ sử dụng một mẫu variadic bình thường:

template<typename... Ts> 
void foo(const Ts&... packs) { 

} 

Sau đó viết một đặc điểm để trích xuất các loại và size_t s. Bạn có thể dễ dàng thêm một số mẫu bí danh trợ giúp để làm bất cứ điều gì bạn ưa thích.

template <typename T> struct extract_args; 

template <template <typename, size_t...> class Pack, typename T, size_t... Args> 
struct extract_args<Pack<T,Args...>> { 
    using type = T; 
    using args = std::index_sequence<Args...>; 
}; 

Sau đó, trong vòng foo bạn có thể trích xuất đối số và sử dụng chúng theo ý bạn muốn. Ví dụ, để có được một std::tuple chứa tất cả các T s từ gói:

using all_ts = std::tuple<typename extract_args<Ts>::type...>; 
3

Tôi đề nghị bạn quản lý Pack lập luận một cách đệ quy, theo cách này

#include <array> 

template <typename T, std::size_t ... Args> 
struct testS 
{ }; 

void foo() 
{ /* terminal iteration */ } 

template <template <typename, std::size_t...> class Pack, 
      typename T, std::size_t ... Args, typename ... Packs> 
void foo (const Pack<T, Args...> pack0, Packs ... packs) 
{ 
    // do something with pack0 

    foo(packs...); 
} 

int main() 
{ 
    foo(testS<int>{}, std::array<long, 5U>{}, testS<char, 7U, 9U, 11U>{}); 

    return 0; 
} 

--- Chỉnh sửa ---

Ví dụ đã sửa đổi để hiển thị việc sử dụng với các loại khác nhau và số biến số std::size_t thông số mẫu.

+0

Giải pháp này thực sự hoạt động khá tốt. Bạn có thể gọi 'foo' với nhiều kiểu mẫu, bao gồm các kiểu (không giống' std :: array') lấy nhiều hơn một tham số mẫu 'size_t'. – Smeeheey

+0

@Smeeheey - chính xác: làm việc với nhiều loại mẫu với biến 'std :: size_t' số tham số mẫu. Tôi đã sửa đổi ví dụ cố gắng nhấn mạnh nó. Cảm ơn. – max66

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