Re[10]: Реализация IN, IN-OUT и OUT параметров функций
От: Galiulin Rishat Faimovich Узбекистан  
Дата: 19.09.11 12:29
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Здравствуйте, Galiulin Rishat Faimovich, Вы писали:


GRF>>Здравствуйте, k.o., Вы писали:


KO>>>Здравствуйте, Galiulin Rishat Faimovich, Вы писали:


GRF>>>>Вроде написал более рабочий вариант specification.hpp:


KO>>>Да, уже лучше, только у нас, по прежнему, не поддерживается преобразование unique_ptr<A> -> unique_ptr<const A>, можно, конечно, сделать его явно:


GRF>>Да, действительно выглядит плохо . Но можно немного короче


KO>Так ведь можно и ещё короче, если не использовать эти обёртки для параметров.


KO>>>Кроме того, у этого подхода есть ещё, скажем так, концептуальная проблема, из-за того что некоторые способы передачи параметров не укладываются в in, in_out и out. Например, мы хотим передавать владение unique_ptr дальше по цепочке вызовов:


KO>>>
KO>>>void sink( std::unique_ptr< const A > arg)
KO>>>{
KO>>>}
 
KO>>>void sink1( std::unique_ptr< const A > arg)
KO>>>{
KO>>>  sink(std::move(arg));
KO>>>}
KO>>>


GRF>>А где здесь проблема? Можете подробнее? У меня вроде вот этот код работает

GRF>>
GRF>>void sink( in< std::unique_ptr< const A > > arg)
GRF>>{
GRF>>}

GRF>>void sink1( in< std::unique_ptr< const A > > arg)
GRF>>{
GRF>>  sink( std::move( arg ) );
GRF>>}
GRF>>


KO>Нужно чтобы работал вот такой код:


KO>
KO>void sink1( in< std::unique_ptr< const A > > arg)
KO>{
KO>  sink( in_( std::move( arg() ) ) );
KO>}
KO>


Попробуйте, пожалуйста, это:
void sink1( in< std::unique_ptr< const A > > arg)
{
  sink( in_( std::move( arg()() ) ) );
}



KO>Понятно, что саму обёртку можно, без проблем, передать дальше.


KO>>>После этого можно будет вспомнить о существовании rvalue-references и необходимости поддерживать perfect forwarding.


GRF>>При реализации мы к сожалению не ориетировались на новый стандарт С++


KO>Ну это, как бы, заметно, хотя и странно для, подобного рода, инфраструктурного кода.


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