#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. Нет, вы пытаетесь присвоить той же переменной тот же тип .