Как вернуть другой тип на основе аргумента enum
У меня есть две функции, которые требуют следующего:
Функция 1: Требуется адрес переменной для установки значения. (Знает о правильном типе)
Функция 2: перегруженная функция, которая требует значения типа.
Мне нужен способ вернуть разные типы на основе перечисления (который указывает тип для использования).
Я попытался использовать std::get, так как вы можете использовать число для указания типа. Однако он требует, чтобы SelectedType был константным выражением, которым он не является.
std::variant<uint8_t,int8_t,uint16_t,int16_t,double,float> Var;
std::get<SelectedTypeEnum>(Var)
Дело в том, чтобы использовать одну переменную, чтобы избежать повторения кода.
Рассмотрим следующий код:
enum Type{
Type_uint8_t,
Type_int8_t,
Type_uint16_t,
Type_int16_t,
Type_std::string
} TypeList;
GetTypeToUse(Type&){ /* Get/Set the type to use */ }
void SetValueBasedOnEnum(Type TypeToUse,void* ptr) {/* Function 1: Sets the value of the type */}
// This is a Overloaded Function which supports all types in the enum.
//"T" represents the type.
void DoStuffWithDifferentTypes(T ValueOfType) { /*Function 2:*/ }
1 ответ
Вы не можете вернуть другой тип на основе значения перечисления, переданного функции. Сигнатура функции устанавливается во время компиляции, поэтому все, что может ее изменить, должно быть конструкцией времени компиляции.
Если вам нужно возвращать разные типы, которые вы можете знать только во время выполнения, вы можете использовать std::variant
или же std::any
для этого. std::variant
это в основном теговое объединение, поэтому вы должны указать, какие типы он может содержать. Если у вас ограниченный набор типов, это предпочтительная структура данных. Если у вас есть неограниченный набор типов, то вы можете использовать std::any
, Он использует стирание типа и динамическое распределение памяти, поэтому его использование намного дороже, чем std::variant
но это цена, которую вы должны заплатить, чтобы получить неограниченную гибкость.
Другой вариант, если он имеет смысл для вашего варианта использования, состоит в том, чтобы все типы наследовали от общего базового типа. Затем вы можете вернуть указатель на базу из функции, но работать с объектом полиморфно.