由于某种原因,我想实现与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++;
}
}