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ô
Trả lời
Đ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.
Không thể? Đây là C++. – Yakk
@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
"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
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.
Được thăng hạng khỏi khủng bố tuyệt đối. – Quentin
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
@ 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
- 1. Chức năng Scala variadic và Seq
- 2. Làm thế nào để xác định một chức năng variadic
- 3. variadic mẫu variadic mẫu
- 4. Go - thông số chức năng variadic pass-through
- 5. Mẫu chức năng thành viên C++ Mẫu variadic
- 6. Chức năng như các đối số của mẫu variadic
- 7. variadic chức năng helper với gói luận phần
- 8. C++ 11 variadic std :: tham số chức năng
- 9. bối cảnh Không suy chức năng variadic mẫu
- 10. gọi Chức năng in -> luồng vĩ mô
- 11. chức năng inline vs chức năng vĩ mô
- 12. Các biến mẫu của mẫu biến thể Variadic variadic
- 13. Cách gọi hàm Clojure variadic từ Java
- 14. Variadic Templates mở rộng gói
- 15. Chuyển tiếp lời gọi hàm variadic trong C
- 16. Undef'ing một chức năng giống như vĩ mô
- 17. chức năng thành viên liên kết trong một thời trang variadic
- 18. C++ template variadic với đôi
- 19. thông số variadic Generic
- 20. Mở rộng với các mẫu variadic
- 21. variadic mẫu loại trừ
- 22. Khả năng mở rộng của các mẫu variadic
- 23. Mở rộng macro MSVC++ variadic
- 24. Tham số chức năng mẫu C++ variadic với giá trị mặc định
- 25. trộn "bùng nổ" lát và các thông số thường xuyên trong các chức năng variadic
- 26. C++ 11 args variadic có giá trị tham số chức năng mặc định
- 27. đọc đối số từ mẫu variadic
- 28. Chuyển dấu chấm lửng sang một hàm variadic khác
- 29. Một mẫu hợp lệ trong assembly cho đối số variadic
- 30. Tại sao clang từ chối chức năng của bạn bè mẫu variadic
Bạn có thể sử dụng mẫu variadic cho 'foo' thay vì dấu chấm lửng không? – Jarod42
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
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. –