Re: Упражнение с templates
От: Павел Кузнецов  
Дата: 24.10.02 16:19
Оценка: 18 (2)
Здравствуйте orangy, Вы писали:

O>parse_cast.


Sorry, подробнее сейчас некогда, может, завтра время еще будет...

Имхо, основная проблема с подобным дизайном заключается в том, что интерфейс как бы рассчитан на проход по последовательности (аргумент — итератор), однако функция не возвращает позицию (итератор) символа, следующего после извлеченного значения. Если начать это делать, то, имхо, в конечном итоге, интерфейс превратится в std::istream :-)

Кроме того, принимать один итератор очень необычно: в частности, это означает, что в контейнере придется хранить лишний терминальный элемент, что не совсем естественно для контейнеров, размер которых известен. Да и вообще, понятие zero-terminated последовательности получается достаточно странноватым :-)

Я бы просто разделил два интерфейса: один принимает пару итераторов, а второй — указатель const char*. Для последнего наличие `\0' в конце вполне естественно.

O>Просьба помочь избавиться от: ret_val_adaptor и it_adaptor ( IT — regards ;) )


Проблема с it_adaptor, на мой взгляд, обусловлена выбором интерфейса. parse_cast как бы ожидает итератор, а ты ему подсовываешь std::string... Включать здесь ad hoc неявное преобразование, на мой взгляд, идеологически некорректно.

Если разделить два интерфейса, как описано выше, то, имхо, parse_cast<>(str.c_str()) уже не выглядит таким страшным. Да и при желании можно просто перегрузить parse_cast для std::basic_string безо всяких it_adaptors.

O>
O>    <...>
O>    std::string test2 = "-12";
O>    std::vector<char> vc(test2.begin(), test2.end());
O>    ival = parse_cast<int>(vc.begin());
O>    <...>


В частности, те же проблемы из-за одного итератора на входе: вектор не содержит последнего `\0' из строки. То что parse_cast<int>(vc.begin()) работает — в данном случае, просто совпадение. Точно так же мог бы быть и seg fault.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.