2015-04-29 17 views
6

Tôi có một inline chức năng variadic
inline int foo(...)
Tôi cần foo() để gọi một macro (chúng ta hãy gọi nó MACRO), cũng là variadic.
Về cơ bản, tôi cần foo() để chuyển tất cả thông số đầu vào của nó đến MACRO. Việc xác định lại foo() là một macro khác sẽ là một giải pháp dễ dàng vì tùy chọn __VA_ARGS__, nhưng tôi cũng cần foo() để trả về một giá trị.
Lưu ý: Tôi đang cố gắng giao tiếp hai phần của mã đã viết và tôi không được phép thay đổi chúng. foo(...) được sử dụng trong phần đầu tiên của mã và MACRO được định nghĩa trong phần thứ hai. Điều duy nhất tôi phải làm là để xác định một foo() trong đó sử dụng MACRO và tôi không thể vì họ là cả hai variadic.variadic chức năng gọi một variadic vĩ mô

+0

Bạn có thể sử dụng mẫu variadic cho 'foo' thay vì dấu chấm lửng không? – Jarod42

+0

Bạn đang nói về varargs hoặc mẫu chức năng variadic? Với một vấn đề của bạn có thể được giải quyết, với một vấn đề khác thì không thể. – Quentin

+4

Không thể thực hiện được. Các tham số chức năng được đặt ở thời gian chạy, các macro được mở rộng trước khi biên dịch. Tôi sẽ vứt bỏ đống lộn xộn này và tìm ra một cách hợp lý để làm bất cứ điều gì nó đang cố gắng làm. –

Trả lời

1

Điều bạn đang yêu cầu là không thể.

Đối số của hàm variadic được xác định khi chạy, nhưng macro mở rộng tại thời gian biên dịch.

+1

Không thể? Đây là C++. – Yakk

+0

@Yakk Nó __is__ không thể. Đọc lại câu hỏi của anh ấy. 'foo' cần phải là hàm, không phải macro. – orlp

+0

"Vì' foo' phải trả về một giá trị. " Tất cả những gì chúng ta cần là một macro trả về một giá trị sau đó! Hy sinh 3 dê nguyên chất trên mars solistice và gọi cho tôi vào buổi sáng. Hoặc, bạn biết đấy, hãy triệu tập những sự ghê tởm với mã C++. Hoặc là làm việc. – Yakk

6

Tạo foo macro chứa lambda trả về giá trị và sau đó gọi lambda đó.

#define foo(...) \ 
    [&](auto&&...args){ \ 
    /* do something with args, or __VA_ARGS__ */ \ 
    MACRO(__VA_ARGS__); \ 
    return 7; \ 
    }(__VA_ARGS__) 

tại int x = foo(a, b, c); sẽ cả gọi lambda bên foo, và bên trong lambda mà gọi vĩ mô trên (a, b, c), và có thể trả về một giá trị.

Tôi tiếc mọi người vẫn duy trì mã của bạn tiếp theo.

+3

Được thăng hạng khỏi khủng bố tuyệt đối. – Quentin

+0

Lưu ý rằng 'args ...' và '__VA_ARGS__' có thể khác với các trường hợp như' foo (arg1, (dấu ngoặc đơn, dấu ngoặc đơn, dấu phẩy, dấu phẩy, toán tử, arg2)); 'hoặc đơn giản' foo (function_with_side_effect()) '. – Jarod42

+0

@ Jarod42 yep! 'Auto && .... args' và' (__VA_ARGS __) 'là tùy chọn và có thể gây ra các tác dụng phụ không thể đoán trước. Tuy nhiên, nó cung cấp cho bạn các đối số như là các đối số, cũng như các thẻ, mà tôi hình là những gì OP muốn. – Yakk

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