C ++ отправляет любой тип аргумента в функцию

Вот и все: я хочу создать функцию void, которая получит два общеизвестных типа значений и еще одну, которая может быть чем угодно. Код будет выглядеть так:

void change_settings(string element, short setting, ??? value) {
switch (setting) {
case ST_NAME:
// Cast value to string or char* and change element.name
break;
case ST_AMOUNT:
// Cast value to integer and change element.amount
break;
case ST_ENABLED:
// Cast value to boolean and change element.enabled
break;
}
}

Я попытался сделать тип значения const void* но я получаю ошибку (cast from ‘const void*’ to ‘short int’ loses precision) потому что я только что сделал это: short name = (short)valueДолжно быть, это какое-то безумное отчаянное испытание, в надежде повезти. Теперь, я не знаю, есть ли способ сделать это, передать указатель на переменную любого типа, а затем преобразовать ее в то, что она есть (я знаю, какой тип переменной ожидать в зависимости от каждого случая.
Как бы я это сделал? Спасибо!

9

Решение

Поскольку вы, кажется, знаете заранее все потенциальные типы valueи вам нужно различное поведение в зависимости от типа, вы можете просто написать серию перегрузок функций:

void change_settings(const std::string& element, short setting, const std::string& value);

void change_settings(const std::string& element, short setting, int value);

void change_settings(const std::string& element, short setting, bool value);

Это устраняет необходимость в переключателе времени выполнения.

7

Другие решения

Вы должны использовать шаблоны

template <typename T>
void change_settings(string element, short setting, T value);
13

Предполагая, что вы говорите о переключении во время выполнения (в отличие от времени компиляции, в этом случае шаблоны, вероятно, являются ответом):

Вы могли бы рассмотреть вариант класса (например, boost::variant) или, возможно, использовать полиморфизм (т. е. определить иерархию наследования и виртуальные функции для реализации определенного поведения).

5
По вопросам рекламы [email protected]