C++ 便捷打印变量名和变量值

2023-03-29  本文已影响0人  卡卡罗忒

前几天看了下SFINAE,挺有启发,写了一个直接打印变量的宏
效果:


image.png

下面附上代码

//
//  WBUtilMacro.hpp
//  jsonTest
//
//  Created by 王璟鑫 on 2023/3/30.
//
using namespace std;
#include <vector>
#include <iostream>
#pragma once

#define VBLOG(...)\
vblog(#__VA_ARGS__,__VA_ARGS__);

#if __APPLE__
    #ifdef DEBUG
        #define VBDLOG(...)\
        VBLOG(__VA_ARGS__)
    #else
        #define VBDLOG(...)
    #endif
#else
    #ifdef NDEBUG
        #define VBDLOG(...)
    #else
        #define VBDLOG(...)\
        VBLOG(__VA_ARGS__)
    #endif
#endif
vector<string> splitString(const string &str, char sep = ','){
    std::vector<std::string> array;
    std::string::size_type pos1, pos2;
    pos1 = 0;
    pos2 = str.find(sep);
    while (std::string::npos != pos2)
    {
        array.push_back(str.substr(pos1, pos2 - pos1));
        pos1 = pos2 + 1;
        pos2 = str.find(sep, pos1);
    }
    if (pos1 != str.length())
        array.push_back(str.substr(pos1));
    return array;
}

//递归终止函数
template <class T>
string LOG(T &val){
    return "非基本数据类型 ,";
}
string LOG(int &val){
    return std::to_string(val);
}
string LOG(long &val){
    return std::to_string(val);
}
string LOG(long long &val){
    return std::to_string(val);
}
string LOG(unsigned &val){
    return std::to_string(val);
}
string LOG(unsigned long &val){
    return std::to_string(val);
}
string LOG(unsigned long long &val){
    return std::to_string(val);
}
string LOG(float &val){
    return std::to_string(val);
}
string LOG(double &val){
    return std::to_string(val);
}
string LOG(long double &val){
    return std::to_string(val);
}
string LOG(string &val){
    return (val);
}
string LOG(const char* &val){
    return val;
}
template <class T, class ...Args>
string LOG(T &val, Args... args){
    return "非基本数据类型 ," + LOG(args...);
}
template < class ...Args>
string LOG(int &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(long &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(long long &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(unsigned &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(unsigned long &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(unsigned long long &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(float &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(double &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(long double &val, Args... args){
    return std::to_string(val) + "," + LOG(args...);
}
template < class ...Args>
string LOG(string &val, Args... args){
    return val + "," + LOG(args...);
}
template < class ...Args>
string LOG(const char* &val, Args... args){
    string a = val;
    return  a + "," + LOG(args...);
}
template <class ...Args>
void vblog(string names,Args...args){
    auto nameArr = splitString(names);
    auto valueArr = splitString(LOG(args...));
    string final = "";
    if (nameArr.size() != valueArr.size()) {
        printf("打印函数出bug啦");
        return;
    }
    for(int i = 0; i < nameArr.size(); ++i){
        final.append(nameArr[i]);
        final.append(" = ");
        final.append(valueArr[i]);
        final.append("   ");
    }
    cout << final << endl;
}




好用

上一篇 下一篇

猜你喜欢

热点阅读