2010-09-18 37 views
8

Tôi muốn viết một hàm có danh sách đối số biến. Tôi muốn khám phá các lựa chọn của tôi. Tôi khá chắc chắn rằng tôi đã vượt qua một lớp mẫu tăng cường được thiết kế cho mục đích này, nhưng tôi không thể nghĩ ra tên của nó? Bất cứ ai có thể cho tôi biết? hoặc tôi đã mơ ước điều này! Cảm ơnDanh sách đối số biến với tăng?

+0

Bạn có nghĩa là số đối số biến nhưng một loại hoặc cũng là các loại tùy ý? –

+0

Tôi không chắc chính xác thư viện được cung cấp là gì, tôi không thể định vị lại nó, tôi đoán đó là một số cải tiến hơn va_list - có thể là loại an toàn – aukm

+0

Chức năng của bạn chỉ cần lấy đối số của một kiểu hay không? –

Trả lời

7

Nếu bạn chỉ cần chấp nhận một số biến đối số cùng loại, việc sử dụng vùng chứa sẽ là điều phổ biến cần làm. Tạo ra các container tuy nhiên có thể được nới lỏng sử dụng Boost.Assign:

void f(const std::vector<int>& vec) {} 
f(boost::assign::list_of(1)(2)(3)(4)); 

Hoặc bạn có thể đi cho nhà khai thác quá tải (ví dụ của operator() hoặc operator<<) cho mình, tương tự như cách tiếp cận thực hiện bởi các con suối thư viện tiêu chuẩn:

op() << arg1 << arg2 << arg3; 

Nếu bạn thực sự muốn cung cấp chức năng variadic loại an toàn (không sử dụng tính năng C++ 0x), Boost.Preprocessor có thể trợ giúp. Ví dụ chung:

#define OUT(z, n, name) << name ## n 

#define MAKE_FUNC(z, n, unused)          \ 
    template<class T BOOST_PP_ENUM_TRAILING_PARAMS(n, class T)>  \ 
    void func(T t BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(n, T, t)) { \ 
     std::cout << t BOOST_PP_REPEAT(n, OUT, t) << std::endl;  \ 
    } 

BOOST_PP_REPEAT(9, MAKE_FUNC, ~) // generates func() versions taking 1-10 arguments 
func(1, "ab", 'c'); // prints "1abc" 
Các vấn đề liên quan