美文网首页
C++ 便捷打印变量名和变量值

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

作者: 卡卡罗忒 | 来源:发表于2023-03-29 17:43 被阅读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;
    }
    
    
    
    
    

    好用

    相关文章

      网友评论

          本文标题:C++ 便捷打印变量名和变量值

          本文链接:https://www.haomeiwen.com/subject/xnwfddtx.html