Boost.Preprocessor - . , , , :
#include <iostream>
#define str(a) #a, " = ", a
#define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL(__VA_ARGS__, 5,4,3,2,1)
#define VA_NUM_ARGS_IMPL(_1,_2,_3,_4,_5,N,...) N
#define CONCAT_IMPL( x, y ) x##y
#define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y )
#define PREPEND_EACH_ARG_WITH_HASH_ARG_1(a) str(a)
#define PREPEND_EACH_ARG_WITH_HASH_ARG_2(a, ...) str(a) , " ; " , PREPEND_EACH_ARG_WITH_HASH_ARG_1(__VA_ARGS__)
#define PREPEND_EACH_ARG_WITH_HASH_ARG_3(a, ...) str(a) , " ; " , PREPEND_EACH_ARG_WITH_HASH_ARG_2(__VA_ARGS__)
#define PREPEND_EACH_ARG_WITH_HASH_ARG_4(a, ...) str(a) , " ; " , PREPEND_EACH_ARG_WITH_HASH_ARG_3(__VA_ARGS__)
#define PREPEND_EACH_ARG_WITH_HASH_ARG_5(a, ...) str(a) , " ; " , PREPEND_EACH_ARG_WITH_HASH_ARG_4(__VA_ARGS__)
#define PREPEND_EACH_ARG_WITH_HASH_ARG(...) MACRO_CONCAT(PREPEND_EACH_ARG_WITH_HASH_ARG_, VA_NUM_ARGS(__VA_ARGS__)) (__VA_ARGS__)
#define PRINT_ALL(...) print_all(PREPEND_EACH_ARG_WITH_HASH_ARG(__VA_ARGS__))
template<typename T>
void print_impl(const T& t)
{
std::cout << t;
}
template<typename T, typename... Ts>
void print_impl(const T& t, const Ts&... ts)
{
std::cout << t;
print_impl(ts...);
}
template <typename ... Ts>
void print_all(const Ts&... ts)
{
print_impl(ts...);
std::cout << std::endl;
}
int main()
{
auto a = 10;
auto b = 20.1;
auto c = "string";
auto d = 'c';
PRINT_ALL(a, b, c, d);
}
, VA_NUM_ARGS PREPEND_EACH_ARG_WITH_HASH_ARG_#, "" PREPEND_EACH_ARG_WITH_HASH_ARG_# __VA_ARGS__.
, , , , , .