2015-12-19 13 views
4
программа

Этот короткий C++ ведет себя таким образом, который сбивает с толку меня:boost :: lexical_cast <signed char> не может обрабатывать отрицательные числа?

#include <cassert> 
#include <iostream> 
#include <string> 
#include <boost/lexical_cast.hpp> 

int main(void) { 
    signed char c = -2; 
    assert(c == -2); 
    c = boost::lexical_cast<signed char>(std::string("-2")); 
    std::cout << c << "\n"; 
} 

Использование g++ 5.2.1 и boost-1.58.0, я получаю:

Terminate вызывается после метания экземпляр «подъема :: exception_detail :: clone_impl >» , что(): плохо лексического литая: значение тип источника не может быть истолковано как цель

Почему не может увеличить бросок из строки„-2“т o signed char, учитывая, что значение -2 представлено этим типом?

+4

Поскольку 'lexical_cast' ведет себя, как если преобразование выполняется через stringstream, и' 'оператор >> для' подписал char' читает символы, а не цифры. –

+0

Как я могу получить желаемое поведение? –

+2

Ничего, я могу сделать 'boost :: lexical_cast (str)', а затем преобразовать в 'signed char', проверяя диапазон ... –

ответ

3

Решение использовать подталкивание:

#include <boost/lexical_cast.hpp> 
#include <boost/numeric/conversion/cast.hpp> 
int tmp = boost::lexical_cast<int>(std::string("-2")); 
char c = boost::numeric_cast<signed char>(tmp);