Альтернатива lexical_cast‹T›(std::string)

У меня есть шаблонный код, который использует lexical_cast.

Теперь я хочу удалить все вызовы lexical_cast (потому что они плохо работают с /clr).

Мне нужно привести объект между std::string и их значением.

Итак, первое направление простое (T _from, std::string _to):

std::ostringstream os;
os << _from;
_to =  os.str();

Но я не могу придумать способ сделать это в общем случае из строки в любой тип (мне нужно что-то общее, что будет работать с шаблонами, не может просто использовать специализации для каждого типа и использовать такие функции, как atoi)

Изменить:

Конечно, я пытался использовать ostringstream в противоположном направлении. Я получаю эту ошибку:

ошибка C2784: 'std::basic_istream‹_Elem,_Traits> &std::operator >>(std::basic_istream‹_Elem,_Traits> &&,_Elem *)': не удалось вывести аргумент шаблона для 'std::basic_istream‹_Elem, _Traits> &&' из 'std::ostringstream'


person Yochai Timmer    schedule 31.07.2011    source источник


Ответы (1)


lexical_cast использует потоковую передачу в обоих направлениях, << и >>. Вы можете сделать то же самое:

std::stringstream sstr;
sstr << _from;
sstr >> _to;

Не забудьте включить проверки работоспособности.

person Konrad Rudolph    schedule 31.07.2011
comment
Пробовал это, конечно... Я получаю эту ошибку: ошибка C2784: 'std::basic_istream‹_Elem,_Traits› &std::operator ››(std::basic_istream‹_Elem,_Traits› &&,_Elem *)': не удалось вывести аргумент шаблона для 'std::basic_istream‹_Elem,_Traits› &&' из 'std::ostringstream' - person Yochai Timmer; 31.07.2011
comment
@Yochai Вы пытаетесь использовать ostringstream! Конечно, это позволяет только потоковую передачу вывода, а не потоковую передачу ввода. Вместо этого используйте stringstream. - person Konrad Rudolph; 31.07.2011
comment
Лол, я даже не заметил там о ... слишком долго смотрел на код. Спасибо - person Yochai Timmer; 31.07.2011