По какой-то причине я хочу реализовать нечто похожее на то, что компиляторы C ++ использовали для вывода аргументов шаблона. С известным набором параметров шаблона, таких как
"T0", "T1", "T2" ...
Учитывая 2 строки, как:
str_param = "vector<T0>"
str_arg = "vector<float>"
Результат должен быть таким, что «T0» отображается на «float»:
map["T0"]=="float"
Мне не нужен полнофункциональный шаблонный препроцессор, а это значит, что я буду удовлетворен, если смогу просто обработать случаи, когда аргумент шаблона может быть выведен буквально. Не нужно рассматривать такие вещи, как «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++;
}
}