Có thể tạo một macro str(a)
rằng sẽ sử dụng đối số của nó (a
) và tên chuyển đổi thành chuỗi của nó (#a
), ví dụ:Làm thế nào để có được tên cho mỗi đối số trong các macro variadic?
#include <iostream>
#define str(a) #a, " ", a
int main()
{
int i = 5;
float f = 4.5;
const char* s = "string";
auto l = [] (const auto&... p) { (std::cout << ... << p) << std::endl; };
l(str(i));
l(str(f));
l(str(s));
}
Có cách đơn giản để in biến số số đối số được thêm vào trước với tên của mỗi đối số không? tức là thực hiện PREPEND_EACH_ARG_WITH_HASH_ARG
từ các mục sau:
#include <iostream>
#include <tuple>
template <typename ... Ts>
void print_all(const Ts&... ts)
{
(std::cout << ... << ts) << std::endl;
}
#define PREPEND_EACH_ARG_WITH_HASH_ARG(...) // how to implement '#a, " ", a' here?
#define PRINT_ALL(...) print_all(PREPEND_EACH_ARG_WITH_HASH_ARG(__VA_ARGS__))
int main()
{
auto a = 10;
auto b = 20.1;
auto c = "string";
auto d = 'c';
PRINT_ALL(a, b, c, d);
}
IOW, triển khai lại bit đó Boost.Preprocessor chính mình :-) – Angew
@Angew Có nhiều hơn hoặc ít hơn :) Tôi không chắc chính xác thư viện Boost được triển khai như thế nào (có lẽ thông minh hơn một chút so với ví dụ của tôi). Tôi thường thích được độc lập với các thư viện của bên thứ ba, vì vậy tôi nghĩ rằng giải pháp đáng nói đến. – Banan
@Banan, cảm ơn vì những lời giải thích, tuy nhiên chấp nhận tham chiếu để tăng thêm câu trả lời vì nó là "cách đơn giản hơn" :) –