模板参数推演的算法(作为字符串)?

时间:2019-03-21 05:56:12

标签: c++ string algorithm compiler-construction

由于某种原因,我想实现与C ++编译器用来推断模板参数的内容类似的功能。具有一组已知的模板参数,例如

“ T0”,“ T1”,“ T2” ...

给出2个字符串,例如:

str_param = "vector<T0>"    
str_arg = "vector<float>"

结果应该是“ T0”被映射为“ float”:

map["T0"]=="float"

我不需要功能齐全的模板预处理器,这意味着,如果我能够处理可以逐字推导出template参数的情况,我将感到满意。无需在上下文中考虑“ typedef”之类的东西。 换句话说,如果我使用结果图替换 str_param 中的模板参数,则它应为 str_arg 。如果那不可能,我将其视为“不匹配”。

我目前有一些类似的问题处理案例:

str_param = "T1*"    
str_arg = "int**"

预期结果是

map["T1"]=="int*"

我的算法将其误认为:

map["T1"]=="int"

将我的算法不正确放在这里:

std::vector<std::string> templ_params({"T1"});
std::vector<std::string> templ_args(templ_params.size());
std::string str_param = "T1*";
std::string str_arg = "int**";
const char* p_str_param = str_param.c_str();
const char* p_str_arg = str_arg.c_str();
while (*p_str_param != 0 && *p_str_arg != 0)
{
    while (*p_str_param == ' ' || *p_str_param == '\t') p_str_param++;
    while (*p_str_arg == ' ' || *p_str_arg == '\t') p_str_arg++;
    if (*p_str_param == 0 || *p_str_arg == 0) break;
    if (*p_str_param != *p_str_arg)
    {
        std::string templ_param;
        std::string templ_arg;
        while (*p_str_param == '_' ||
            (*p_str_param >= 'a' && *p_str_param <= 'z') ||
            (*p_str_param >= 'A' && *p_str_param <= 'Z') ||
            (*p_str_param >= '0' && *p_str_param <= '9'))
            templ_param += *(p_str_param++);
        while (*p_str_param == ' ' || *p_str_param == '\t') p_str_param++;
        char end_marker = *p_str_param;
        const char* p_str_arg_end = p_str_arg;
        while (*p_str_arg_end != end_marker) p_str_arg_end++;
        while (*(p_str_arg_end - 1) == ' ' || *(p_str_arg_end - 1) == '\t') 
            p_str_arg_end--;
        while (p_str_arg<p_str_arg_end) templ_arg += *(p_str_arg++);
        for (size_t i=0; i < templ_params.size(); j++)
        {
             if (templ_params[i]==templ_param)
             {
                 templ_args[i]=templ_arg;
                 break;
             }
        }
    }
    else
    {
        p_str_param++;
        p_str_arg++;
    }
}

0 个答案:

没有答案