Как поместить std :: dec / hex / oct в поисковый массив - PullRequest
0 голосов
/ 08 августа 2009

У меня есть эта общая строка для преобразования числа:

    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': массивы ссылок недопустимы

Итак, есть ли решение этой проблемы?

1 Ответ

2 голосов
/ 08 августа 2009

Попробуйте:

std::ios_base& (*arr[])( std::ios_base& ) = { std::oct, std::dec, std::hex };

Или с typedef для указателя функции:

typedef std::ios_base& (*ios_base_setter)( std::ios_base& );

ios_base_setter arr[] = { std::oct, std::dec, std::hex };

Вы можете опустить размер массива, он будет определен из числа инициализаторов. Я заметил это, потому что вы указали массив размером 2, но предоставили 3 инициализатора.

...