宏重载 + 计算宏可变参数的参数包大小
宏重载 + 计算可变参数宏中的参数数量
...非常神奇...学到了...
#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
#define MACRO_2(a,b) std::cout << a << ' ' << b << "\n";
#define MACRO_1(a) MACRO_2(a,"test")
#define VARGS_(_10,_9,_8,_7,_6,_5,_4,_3,_2,_1,N,...) N
#define VARGS(...) VARGS_(__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)
#define CONCAT_(a,b) a##b
#define CONCAT(a,b) CONCAT_(a,b)
#define MACRO(...) CONCAT(MACRO_,VARGS(__VA_ARGS__))(__VA_ARGS__) // 这是宏重载入口
#define num(...) VARGS(__VA_ARGS__) // 这里是计算参数个数
int main()
{
ll val = 10;
MACRO(val,2);
MACRO(val);
cout << num("132",2,3,1.0) << endl;
cout << num(1,2,3,4,5,6,7,8,9,10,11,12,13) << endl;
return 0;
}
debug.h
#include <iostream>
#include <iomanip>
template <typename T>
void __print(int line,const char * const name,T const& rhs) {
std::cout << "in line " << std::setw(4) << std::right << line << " : " << name << " = " << rhs << std::endl;
}
#define __debug(val) __print(__LINE__,#val,val)
#define __debug_1(a) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);;std::cout << std::endl;} while(0)
#define __debug_2(a,b) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);;std::cout << std::endl;} while(0)
#define __debug_3(a,b,c) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);__debug(c);;std::cout << std::endl;} while(0)
#define __debug_4(a,b,c,d) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);__debug(c);__debug(d);;std::cout << std::endl;} while(0)
#define __debug_5(a,b,c,d,e) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);;std::cout << std::endl;} while(0)
#define __debug_6(a,b,c,d,e,f) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);;std::cout << std::endl;} while(0)
#define __debug_7(a,b,c,d,e,f,g) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);__debug(g);;std::cout << std::endl;} while(0)
#define __debug_8(a,b,c,d,e,f,g,h) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);__debug(g);__debug(h);;std::cout << std::endl;} while(0)
#define __debug_9(a,b,c,d,e,f,g,h,i) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);__debug(g);__debug(h);__debug(i);;std::cout << std::endl;} while(0)
#define __debug_10(a,b,c,d,e,f,g,h,i,j) do {std::cout << std::endl << __TIME__<< std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);__debug(g);__debug(h);__debug(i);__debug(j);;std::cout << std::endl;} while(0)
#define VARGS_(_10,_9,_8,_7,_6,_5,_4,_3,_2,_1,N,...) N
#define VARGS(...) VARGS_(__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)
#define CONCAT_(a,b) a##b
#define CONCAT(a,b) CONCAT_(a,b)
#define debug(...) CONCAT(__debug_,VARGS(__VA_ARGS__))(__VA_ARGS__)
debug宏2.0
#pragma once
#include <iostream>
#include <iomanip>
#include <utility>
template<typename T>
ostream& operator << (ostream& os,std::vector<T> const& rhs) {
os << "(";
if (rhs.size()) {
os << rhs.front();
for (int i = 1;i < rhs.size();++i) {
os << "," << rhs[i];
}
}
os << ")";
return os;
}
template<typename T1,typename T2>
ostream& operator << (ostream& os,std::pair<T1,T2> const& rhs) {
return os << "(" << rhs.first << "," << rhs.second << ")";
}
template <typename T>
void __print(int line,const char * const name,T const& rhs) {
std::cout << "in line " << std::setw(4) << std::right << line << " : " << name << " = " << rhs << std::endl;
}
#define __debug(val) __print(__LINE__,#val,val)
#define __debug_1(a) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);std::cout << std::endl;} while(0)
#define __debug_2(a,b) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);std::cout << std::endl;} while(0)
#define __debug_3(a,b,c) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);__debug(c);std::cout << std::endl;} while(0)
#define __debug_4(a,b,c,d) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);__debug(c);__debug(d);std::cout << std::endl;} while(0)
#define __debug_5(a,b,c,d,e) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);std::cout << std::endl;} while(0)
#define __debug_6(a,b,c,d,e,f) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);std::cout << std::endl;} while(0)
#define __debug_7(a,b,c,d,e,f,g) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);__debug(g);std::cout << std::endl;} while(0)
#define __debug_8(a,b,c,d,e,f,g,h) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);__debug(g);__debug(h);std::cout << std::endl;} while(0)
#define __debug_9(a,b,c,d,e,f,g,h,i) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);__debug(g);__debug(h);__debug(i);std::cout << std::endl;} while(0)
#define __debug_10(a,b,c,d,e,f,g,h,i,j) do {std::cout << std::endl << __TIME__<< " " << __func__ << std::endl;__debug(a);__debug(b);__debug(c);__debug(d);__debug(e);__debug(f);__debug(g);__debug(h);__debug(i);__debug(j);std::cout << std::endl;} while(0)
#define VARGS_(_10,_9,_8,_7,_6,_5,_4,_3,_2,_1,N,...) N
#define VARGS(...) VARGS_(__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)
#define CONCAT_(a,b) a##b
#define CONCAT(a,b) CONCAT_(a,b)
#define debug(...) CONCAT(__debug_,VARGS(__VA_ARGS__))(__VA_ARGS__)
本文来自博客园,作者:XDU18清欢,转载请注明原文链接:https://www.cnblogs.com/XDU-mzb/p/14862056.html
浙公网安备 33010602011771号