Очевидное решение состоит в том, чтобы создать одну символьную строку и использовать на ней стандартные методы преобразования:
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 ) ];