Вот и все: я хочу создать функцию 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
Должно быть, это какое-то безумное отчаянное испытание, в надежде повезти. Теперь, я не знаю, есть ли способ сделать это, передать указатель на переменную любого типа, а затем преобразовать ее в то, что она есть (я знаю, какой тип переменной ожидать в зависимости от каждого случая.
Как бы я это сделал? Спасибо!
Поскольку вы, кажется, знаете заранее все потенциальные типы 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);
Это устраняет необходимость в переключателе времени выполнения.
Вы должны использовать шаблоны
template <typename T>
void change_settings(string element, short setting, T value);
Предполагая, что вы говорите о переключении во время выполнения (в отличие от времени компиляции, в этом случае шаблоны, вероятно, являются ответом):
Вы могли бы рассмотреть вариант класса (например, boost::variant
) или, возможно, использовать полиморфизм (т. е. определить иерархию наследования и виртуальные функции для реализации определенного поведения).