2015-04-18 20 views
9

Nói cách khác khi chức năng tuyên bố như thế này với 'T' là một số loại-alias:Mục đích của hàm chỉ với số tham số không xác định là gì?

T (...) 

sẽ bao giờ hữu ích?

Nếu bạn không biết tuyên bố như vậy chỉ định một hàm có số tham số không xác định. Nó được cho phép bởi tiêu chuẩn C++ nhưng nó không cung cấp cho chúng ta một cách tiêu chuẩn để truy cập các đối số đã qua. Có thư viện <cstdarg> nhưng nó yêu cầu đặt tên tham số trước dấu ba chấm để hoạt động. Nó giống như thế này (với một kiểu bí danh tên 'T1'):

T (T1, ...) 

thường T1 là loại int và sepcifies số lượng đối số variadic.

Tuy nhiên thực tế là dấu ba chấm có thể là tham số hàm duy nhất có nghĩa là cấu trúc như vậy có một số mục đích và tôi là curios nó là gì?

Một ví dụ thực tế của chức năng như vậy sẽ giống như thế này:

void func(...) 
{ 
} 
+2

Tôi thực sự đã sử dụng điều này khá nhiều. Nó rất hữu ích trong việc lập trình mẫu meta với SFINAE do các quy tắc quá tải có liên quan đến – bolov

+0

Có thể bạn muốn tạo ra một chức năng lấy bất kỳ đối số nào, nhưng bạn thực sự không quan tâm hoặc sử dụng các đối số? –

+0

http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error (ví dụ: xem has_typedef_foobar) hoặc http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/SFINAE – bolov

Trả lời

11

Một ví dụ là lừa Lập trình meta để tận dụng thực tế là ... luôn luôn là một tình trạng quá tải khả thi nhưng là ít nhất được ưu tiên. Ví dụ: đặc điểm kiểu này sẽ kiểm tra xem một thành viên cụ thể (foo) tồn tại:

template <typename T> 
struct has_foo { 
    template <typename U> 
    static std::true_type test(decltype(U::foo)*); 

    template <typename U> 
    static std::false_type test(...); 

    using type = decltype(test<T>(0)); 
}; 
Các vấn đề liên quan