Определить тип шаблона из локальной переменной, заданной не константами времени компиляции?

#c #templates #generics #types #generic-programming

#c #шаблоны #общие положения #типы #общее программирование

Вопрос:

Я делаю перенос из Scheme в C , и частью этого является преобразование строкового типа из «car» (функция Scheme, которую я реализовал в C ) в его фактический тип — я вывожу это с помощью регулярного выражения. Моя проблема в том, что моя функция должна возвращать разные типы в зависимости от характера входной строки. Я попытался решить эту проблему, определив возвращаемое значение по имени шаблона функции, но поскольку его конечное значение не является константой времени компиляции, как я могу сделать это возможным?

 // determine_type.cpp

#include <regex>
#include "example_3.cpp"

std::string INT_REGEX = "^[- ]?\d $",
            DOUBLE_REGEX = "^[- ]?\d \.\d?$",
            BOOLEAN_REGEX = "^(true|false)$";

bool matchRegex(std::string pattern, std::string inputString) {
    std::regex expression(pattern);
    return std::regex_match(inputString, expression);
}

template <typename T>
T convertVarType(std::string var) {
    T returnVal;

    if (var[0] == '(' amp;amp; var.back() == ')')
        returnVal = var; // list
    else if (matchRegex(INT_REGEX, var))
        returnVal = std::stoi(var);
    else if (matchRegex(DOUBLE_REGEX, var))
        returnVal = std::stod(var);
    else if (matchRegex(BOOLEAN_REGEX, var))
        returnVal = (var == "true");
    else
        returnVal = var; // string or variable

    return returnVal;
}

int main() {
    std::string expression = "(define x (  5 3 (* 2 2)))";
    std::string firstElement = car(expression); // yields "define", from another file
    auto firstVar = convertVarType(firstElement);
    // std::string firstVar = convertVarType(firstElement); // doesn't work either
}
  

Комментарии:

1. Похоже, у вас проблема XY, вы не можете изменить тип результата функции шаблона на основе информации о времени выполнения. Одним из возможных решений является использование std::variant с возможными типами.

2. Чтобы запустить свой собственный механизм диспетчеризации, вы включаете значение времени выполнения и создаете переменные с другим типом в случаях переключения.

3. @PasserBy это именно то, что я делаю

4. Нет, вы пытаетесь присвоить той же переменной тот же тип .