У меня есть эта общая строка для преобразования числа:
enum STRING_BASE : signed int {
BINARY = -1,
OCTAL = 0,
DECIMAL = 1,
HEX = 2,
};
template <class Class>
static bool fromString(Class& t, const std::string& str, STRING_BASE base = DECIMAL) {
if (base == BINARY) {
t = (std::bitset<(sizeof(unsigned long)*8)>(str)).to_ulong();
return true;
}
std::istringstream iss(str);
std::ios_base& (*f)(std::ios_base&); /// have no idea how to turn this into a look-up array
switch (base) {
case OCTAL: f = std::oct; break;
case DECIMAL: f = std::dec; break;
case HEX: f = std::hex; break;
}
return !(iss >> f >> t).fail();
};
Я хотел бы превратить корпус переключателя в массив с хорошим обзором, что-то вроде этого:
std::ios_base arr[2] = {std::oct, std::dec, std::hex};
return !(iss >> arr[(int)base] >> t).fail();
Это приводит: * ошибка C2440: «инициализация»: невозможно преобразовать из «std :: ios_base & (__cdecl ) (std :: ios_base &)» в «std :: ios_base»
Это тоже не сработает:
std::ios_base& arr[2] = {std::oct, std::dec, std::hex};
Я получаю: ошибка C2234: 'arr': массивы ссылок недопустимы
Итак, есть ли решение этой проблемы?