Алгоритм вывода аргументов шаблона (в виде строк)? - PullRequest
0 голосов
/ 21 марта 2019

По какой-то причине я хочу реализовать нечто похожее на то, что компиляторы 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++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...