2010-09-02 33 views
11

Tôi đã chỉ tự hỏi nếu có bất cứ điều gì trong C + + 0x std lib đã có sẵn để đếm số lượng các tham số trong một gói tham số? Tôi muốn loại bỏ field_count trong mã bên dưới. Tôi biết tôi có thể xây dựng truy cập của riêng tôi, nhưng nó chỉ có vẻ như điều này sẽ là một điều rõ ràng để bao gồm trong C + + 0x std lib, và tôi muốn chắc chắn rằng nó đã không có sẵn :) được chào đón nhiều nhất.Đếm các tham số trong gói tham số? Có chức năng lib std C++ 0x cho điều này không?

template<const int field_count, typename... Args> struct Entity { 
    const tuple<Args...> data; 
    const array<const char*, field_count> source_names; 

    Entity() : data() { 
    } 
}; 
+1

Duplicate của [? Làm thế nào để tìm ra chiều dài của một gói tham số] (http://stackoverflow.com/questions/2770474/ Tôi biết tôi đã học về 'sizeof ...' từ một câu trả lời ở đây ... –

+0

Tôi thực sự đọc một câu trả lời trước khi đăng câu hỏi này, nhưng dựa trên trên đọc cursory tôi đã làm, tôi đã không chắc chắn họ đã nhận được tại số lượng thực tế của các thông số so với tổng kích thước của tất cả các tham số. Lol, tôi thích câu hỏi của tôi tốt hơn, nó rõ ràng hơn cho tôi :) –

Trả lời

27

Có, bạn có thể sử dụng sizeof.... Từ C++ 0x FCD (§5.3.3/5):

Định danh trong biểu thức sizeof... phải đặt tên cho gói tham số. Toán tử sizeof... cho số lượng đối số được cung cấp cho mã định danh gói thông số. Gói thông số được mở rộng (14.5.3) bởi toán tử sizeof.... [Ví dụ:

template<class... Types> 
struct count { 
    static const std::size_t value = sizeof...(Types); 
}; 

- cuối dụ]

+0

Tôi thích có thể sử dụng sizeof theo cách này, nhưng bây giờ tôi tò mò/thận trọng. Thông thường tôi mong đợi sizeof để trả về số byte, nhưng ở đây nó unpacks và đếm args cho tôi. Với một mảng, sizeof điển hình sẽ cho tôi kích thước theo byte của mảng. Có bất kỳ "gotchas" mọi người cần phải xem ra cho việc sử dụng sizeof ...? Tôi không đủ chuyên gia w/C++ để xem tại thời điểm này, nhưng có một chút gì đó đối với tôi về việc sử dụng sizeof để đếm mọi thứ thay vì nhận được kích thước thực tế bằng byte. Tôi chỉ là hoang tưởng về mặt ngữ nghĩa? lol. –

+0

@pheadbaq: Bạn chỉ có thể sử dụng 'sizeof ...' trên một gói tham số và nó luôn trả về số đối số trong gói. Tôi không nghĩ có nhiều chỗ cho lỗi trong việc sử dụng nó, nhưng tôi hiểu ý của bạn là gì. Cá nhân, tôi nghĩ rằng 'sizeof ...' là một sự lạm dụng vô lý của từ khóa 'sizeof', nhưng, tôi không viết ngôn ngữ, tôi chỉ sử dụng nó. :-) –

+8

Lưu ý sự khác biệt của 'sizeof ... (Types)' và 'sizeof (Types) ...'. Sau đó đếm byte, trước đây là đếm các loại :) –

3

Đây là a link có thể giúp bạn. Nguồn mẫu từ liên kết:

template<typename... Args> struct count; 

template<> 
struct count<> { 
    static const int value = 0; 
}; 

template<typename T, typename... Args> 
struct count<T, Args...> { 
    static const int value = 1 + count<Args...>::value; 
}; 
+0

Liên kết không còn hoạt động, tại sao bạn thêm 1 vào số đếm? –

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