宏重载 + 计算宏可变参数的参数包大小

宏重载 + 计算可变参数宏中的参数数量

...非常神奇...学到了...

#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__)
posted @ 2021-06-08 11:21  XDU18清欢  阅读(86)  评论(0)    收藏  举报