Как вернуть другой тип на основе аргумента enum - PullRequest
1 голос
/ 27 июня 2019

У меня есть две функции, для которых требуется следующее:

Функция 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 Ответ

4 голосов
/ 27 июня 2019

Вы не можете вернуть другой тип, основанный на значении перечисления, переданного функции.Подпись функции устанавливается во время компиляции, поэтому все, что могло бы изменить ее, должно быть конструкцией времени компиляции.

Если вам нужно возвращать различные типы, которые вы можете знать только во время выполнения, вы можете использовать std::variant или std::any за это.std::variant - это в основном теговое объединение, поэтому вы должны указать, какие типы он может содержать.Если у вас ограниченный набор типов, это предпочтительная структура данных.Если у вас есть неограниченный набор типов, вы можете использовать std::any.Он использует стирание типов и динамическое выделение памяти, поэтому его использование намного дороже, чем std::variant, но это та цена, которую вы должны заплатить, чтобы получить неограниченную гибкость.

Другой вариант, если он имеет смысл дляВы используете case, чтобы все типы наследовали от общего базового типа.Затем вы можете вернуть указатель на базу из функции, но работать с объектом полиморфно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...