Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:14
Оценка:
Читаю книгу Matthew Wilson, Imperfect C++ и на странице 344 вижу такой код:

template <typename T>
inline T *get_ptr(std::auto_ptr<T> &p)
{
  return p.get();
}
template <typename T>
inline T const *get_ptr(std::auto_ptr<T> const &p)
{
  return p.get();
}


В чем смысл этой перегрузки, почему вместо двух шаблонов не использовать один?:

template <typename T>
inline T *get_ptr(std::auto_ptr<T> const &p)
{
  return p.get();
}
Re: Wilson и auto_ptr
От: makes Россия  
Дата: 28.08.09 15:21
Оценка: +1
Здравствуйте, igna, Вы писали:
I>
I>template <typename T>
I>inline T *get_ptr(std::auto_ptr<T> &p)
I>{
I>  return p.get();
I>}
I>template <typename T>
I>inline T const *get_ptr(std::auto_ptr<T> const &p)
I>{
I>  return p.get();
I>}
I>


I> В чем смысл этой перегрузки... ?


В том, чтобы работало
так
auto_ptr<X> ptr;
X *px; 
px = get_ptr(ptr);

и так
auto_ptr<X> const ptr;
const X *px;
px = get_ptr(ptr);
Re: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 15:23
Оценка:
Здравствуйте, igna, Вы писали:

I>В чем смысл этой перегрузки, почему вместо двух шаблонов не использовать один?:


I>
I>template <typename T>
I>inline T *get_ptr(std::auto_ptr<T> const &p)
I>{
I>  return p.get();
I>}
I>


ИМХО потому что в T::get() такаяже петрушка, а смысла никакого
Re[2]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:24
Оценка:
Здравствуйте, makes, Вы писали:

M>В том, чтобы работало

M>так
M>auto_ptr<X> ptr;
M>X *px; 
M>px = get_ptr(ptr);

M>и так
M>auto_ptr<X> const ptr;
M>const X *px;
M>px = get_ptr(ptr);


Мой вариант с одним только шаблонам в обоих случаях будет работать тоже.
Re[2]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:25
Оценка:
Здравствуйте, Programador, Вы писали:

P>ИМХО потому что в T::get() такаяже петрушка, а смысла никакого


Ну а какой смысл добавляет перегрузка?
Re[3]: Wilson и auto_ptr
От: makes Россия  
Дата: 28.08.09 15:25
Оценка:
Здравствуйте, igna, Вы писали:

I>Мой вариант с одним только шаблонам в обоих случаях будет работать тоже.


В твоем варианте ты неявно убираешь константность объекта, а это не есть хорошо.
Re[2]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 15:26
Оценка:
Здравствуйте, makes, Вы писали:

M>и так

Оно и так и так работает с кодом предложенным igna
Re[4]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:29
Оценка:
Здравствуйте, makes, Вы писали:

M>В твоем варианте ты неявно убираешь константность объекта, а это не есть хорошо.


Неверно. Приглядись повнимательнее, объект там не константен (если конечно T не константен), константным там является auto_ptr.
Re[4]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 15:31
Оценка:
Здравствуйте, makes, Вы писали:

M>В твоем варианте ты неявно убираешь константность объекта, а это не есть хорошо.

Убрать нельзя, правильней сказать неявно добавляется
Re[5]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:32
Оценка:
Здравствуйте, Programador, Вы писали:

P>Убрать нельзя, правильней сказать неявно добавляется


Куда чего добавляется?
Re[3]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 15:35
Оценка:
Здравствуйте, igna, Вы писали:

I>Ну а какой смысл добавляет перегрузка?

может в T::get() чегото сооптимизировали, но думаю врядли
Re[5]: Wilson и auto_ptr
От: makes Россия  
Дата: 28.08.09 15:38
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, makes, Вы писали:


M>>В твоем варианте ты неявно убираешь константность объекта, а это не есть хорошо.


I>Неверно. Приглядись повнимательнее, объект там не константен (если конечно T не константен), константным там является auto_ptr.


смысл выражения
const& ptr<T>

в том, чтобы "защитить" от изменения не поинтер (кому он нужен!), а собственно сам объект.
ИМХО
Re[6]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 15:41
Оценка:
Здравствуйте, igna, Вы писали:

I>Куда чего добавляется?

У Вас берется простой П и добавляется константность и зовется T T::get() const всегда, а в исходном может зваться простой T T::get()
Re[4]: Wilson и auto_ptr
От: makes Россия  
Дата: 28.08.09 15:42
Оценка:
Здравствуйте, Programador, Вы писали:

P>Здравствуйте, igna, Вы писали:


I>>Ну а какой смысл добавляет перегрузка?

P>может в T::get() чегото сооптимизировали, но думаю врядли

по моему это из темы "защита от дурака"
Re[6]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:43
Оценка: +1 :)
Здравствуйте, makes, Вы писали:

M>смысл выражения

const& ptr<T>

M>в том, чтобы "защитить" от изменения не поинтер (кому он нужен!), а собственно сам объект.

По-моему это твое выражение вовсе лишено смысла.
Re[7]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:44
Оценка:
Здравствуйте, Programador, Вы писали:

P>У Вас берется простой П и добавляется константность и зовется T T::get() const всегда, а в исходном может зваться простой T T::get()


А он там есть, простой?
Re[5]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:45
Оценка:
Здравствуйте, makes, Вы писали:

M>по моему это из темы "защита от дурака"


А пример?
Re[8]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 15:49
Оценка:
Здравствуйте, igna, Вы писали:

I>А он там есть, простой?

Что значит есть? Он может быть простой.

Если хранилище собственно данных в куче и исходный с конечным константные то возможно можно избежать дублирования данных, но это только возможно и смотря как писать
Re: Wilson и auto_ptr
От: Alexander G Украина  
Дата: 28.08.09 15:53
Оценка: +1 :)
Здравствуйте, igna, Вы писали:

I>В чем смысл этой перегрузки, почему вместо двух шаблонов не использовать один?:


Я считаю, просто дело привычки писать две версии в подобных случаях, написано неправильно "на автомате".
Если бы это было задумано, const вариант был бы консистентен:

template <typename T>
inline T * const get_ptr(std::auto_ptr<T> const &p)
{
  return p.get();
}



или
template <typename T>
inline T const *get_ptr(std::auto_ptr<T const > &p)
{
  return p.get();
}

, но ни один из этих вариантов смысла не имеет.
Русский военный корабль идёт ко дну!
Re[9]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 15:54
Оценка:
Здравствуйте, Programador, Вы писали:

P>Что значит есть? Он может быть простой.


Может, не может... В стандарте его просто нет.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.