关键代码
// 解析为函数
bool FunctionCreator::parse(const QString& lineFunc) {
    auto trimFunc = lineFunc.trimmed();
    auto list = trimFunc.split(" ");
    bool bHasReturn = false;
    // 返回值和函数名解析
    for (const auto& key : list) {
        auto trimKey = key.trimmed();
        if(trimKey.isEmpty())
            continue;
        if("virtual" == trimKey.toLower())
            continue;
        if("void" == trimKey.toLower()) {
            bHasReturn = true;
            continue;
        }
        if(!bHasReturn) {
            if(m_returnType.decoration.isEmpty()) {
                m_returnType.decoration += trimKey;
                continue;
            } else {
                // 返回值数据类型扩展,首个数据可能是类型修饰符
                if(trimKey.endsWith('*')) {
                    m_returnType.decoration += " " + trimKey;
                    bHasReturn = true;
                    continue;
                }
                if(trimKey.endsWith('&')) {
                    m_returnType.decoration += " " + trimKey;
                    bHasReturn = true;
                    continue;
                }
                if(trimKey.endsWith(']')) {
                    m_returnType.decoration += " " + trimKey;
                    bHasReturn = true;
                    continue;
                }
                if(trimKey.startsWith("const")) {
                    m_returnType.decoration += " " + trimKey;
                    continue;
                }
                if(trimKey.startsWith("volatile")) {
                    m_returnType.decoration += " " + trimKey;
                    continue;
                }
                const auto& typeKeys = FunctionCreator::typeKeys();
                for (const auto& type : typeKeys) {
                    bHasReturn = m_returnType.decoration.contains(type);
                    if(bHasReturn)
                        break;  // 有基础数据类型,返回值有效
                }
            }
        }
        // 匹配首个大写字母
        auto paramStartPos = trimKey.indexOf('(');
        if(-1 == paramStartPos)
            break;
        QRegularExpression regex("[A-Z]");
        QRegularExpressionMatch match = regex.match(trimKey);
        if (match.hasMatch() && match.capturedStart() < paramStartPos) {
            m_prefixName = trimKey.mid(0, match.capturedStart());
            m_name = trimKey.mid(match.capturedStart(), paramStartPos - match.capturedStart());
        } else {
            m_name = trimKey.mid(0, paramStartPos);
        }
        break;
    }
    // 函数参数解析
    auto paramStartPos = lineFunc.indexOf('(');
    auto paramEndPos = lineFunc.lastIndexOf(')');
    if(-1 == paramStartPos || -1 == paramEndPos)
        return false;
    auto params = lineFunc.mid(paramStartPos + 1, paramEndPos - paramStartPos - 1).split(',');
    Param var;
    for (const auto& param : params) {
        auto trimParam = param.trimmed();
        if(trimParam.isEmpty())
            continue;
        auto varNameStartIndex = trimParam.lastIndexOf(' ');
        if(-1 == varNameStartIndex) {
            var.type.decoration = trimParam;
            continue;
        }
        var.type.decoration = trimParam.mid(0, varNameStartIndex).trimmed();
        var.name = trimParam.mid(varNameStartIndex).trimmed();
        addParam(var);
    }
    // 函数尾部解析
    auto lastSuffix = lineFunc.mid(paramEndPos);
    auto lastSuffixs = lastSuffix.split(' ');
    for (const auto& suffix : lastSuffixs) {
        auto trimSuffix = suffix.trimmed();
        if(trimSuffix.isEmpty())
            continue;
        if("const" == trimSuffix.toLower())
            m_lastSuffixs.emplace_back(trimSuffix.toLower());
    }
    return true;
}
解析前
 
解析后

C++自定义接口类设计器-CSDN博客
创作不易,小小的支持一下吧!














![latex换行\left[和\right]编译报错-解决方案](https://i-blog.csdnimg.cn/direct/9ef7a71ea9d04bbe8cc29903f1dd97eb.png)



![[CISCN2019 华北赛区 Day1 Web1]Dropbox 1](https://i-blog.csdnimg.cn/direct/5255a74ac29f4958a5d6c82592db27f7.png#pic_center)


