На первый взгляд это кажется очень тривиальной проблемой.
У меня есть ввод: string a, string b
.b
принимает только два значения: "string"
и "int"
.
Я хочу объявить новую переменную var0
с типом, соответствующим b
.
Как реализовать логику?
Я думал эта функция сработает, но нет.
auto varx(std::string a, std::string b){
if (b == "int") return std::stoi(a);
return a;
}
например auto var0 = varx("43", "int");
следует установить var0
как int var0 = 43;
Я видел union
или variant
в обсуждениях, но не знаю, как это реализовать.
По сути, auto
также должен быть выведен во время компиляции.
Это действительно похоже на то, что вам нужно сделать шаг назад и пересмотреть то, что вы делаете. Чего вы на самом деле пытаетесь здесь достичь? Каков вариант использования?
Что ты хочешь делать? Как вы думаете, зачем вам это нужно? В общем, вы не можете специализироваться на типе возвращаемого значения в C++, несмотря ни на что. Думаю, вы ищете сериализацию . Если это так, попробуйте использовать стороннюю библиотеку (например, protobuf/flatbuffer или что-то вроде nlohman/json).
Вы можете сделать это, используя желаемую функциональность в C++, вы можете использовать std::variant для динамической обработки различных типов. Вот фрагмент:
#include <iostream>
#include <variant>
#include <string>
// Define a variant that can hold either an int or a string
using VariantType = std::variant<int, std::string>;
VariantType varx(const std::string& a, const std::string& b) {
if (b == "int") {
return std::stoi(a); // Convert the string to an int
}
return a; // Return the string as is
}
int main() {
VariantType var0 = varx("43", "int");
VariantType var1 = varx("Hello", "string");
// To get the value out of the variant, you need to use std::get
if (std::holds_alternative<int>(var0)) {
std::cout << "var0 is an int: " << std::get<int>(var0) << std::endl;
} else {
std::cout << "var0 is a string: " << std::get<std::string>(var0) << std::endl;
}
if (std::holds_alternative<int>(var1)) {
std::cout << "var1 is an int: " << std::get<int>(var1) << std::endl;
} else {
std::cout << "var1 is a string: " << std::get<std::string>(var1) << std::endl;
}
return 0;
}
Правильный ответ. Но все, что он делает, это усложняет код в 10 раз, чем он должен быть.
Вместо использования std::holds_alternative
и std::get
рассмотрите возможность использования std::visit.
@selbie правда, надо было спросить вариант использования. C++ уже сложен. зачем делать это больше
@RemyLebeau Ах, но похоже, что у std::visit есть конкретный вариант использования
С++ не поддерживает это. Функция должна иметь определенный тип возвращаемого значения, который можно определить во время компиляции. Понятие функции, которая «иногда возвращает целое число» и «иногда возвращает строку», не существует, как в Python и Javascript.