Шаблон Variadic в VS 2012 (Visual C ++ Ноябрь 2012 CTP)

Очевидное решение состоит в том, чтобы создать одну символьную строку и использовать на ней стандартные методы преобразования:

std::istringstream tmp( std::string( 1, A ) );
tmp >> anInt;

Это немного тяжело, однако (мягко говоря) и, вероятно, не очень

Одно простое и надежное решение - это поиск в таблице:

static char const digits[] = "0123456789ABCDEF";
int value = std::find(digits, digits + 16, A) - digits;
if (value >= 16) {
    //  A wasn't a hex digit...
}

Альтернативно (и намного быстрее) для используйте символ в качестве индекса в таблице:

static signed char const values[] =
{
    -1, -1, -1, -1, -1, -1, -1, -1,     //  0x00-0x07
    //  ...
     0,  1,  2,  3,  4,  5,  6,  7,     //  0x30-0x37
     8,  9, -1, -1, -1, -1, -1, -1,     //  0x38-0x3F
    -1, 10, 11, 12, 13, 14, 15, -1,     //  0x40-0x47
    //  ...
    -1, 10, 11, 12, 13, 14, 15, -1,     //  0x60-0x67
    //  ...
};


int value = values[static_cast<unsigned char>( A )];

Обратите внимание, что это очень зависит от кодировки; вы можете создать его во время выполнения из списка цифр, чтобы избежать каких-либо проблем с кодировкой. Что-то вроде:

struct ValueTable
{
    signed char values[256];
    ValueTable()
    {
        std::fill( begin(values), end(values), -1 );
        static char const digits[] = "0123456789ABCDEF";
        for ( int i = 0; i < 16; ++ i ) {
            values[ digits[i] = i;
            values[ tolower( digits[i] ) ] = i;
        }
    }
};
static ValueTable const map;

//   ...
int value = map.values[ static_cast<unsigned char>( A ) ];
13
задан SomeWittyUsername 5 November 2012 в 19:13
поделиться