Здравствуйте, Galiulin Rishat Faimovich, Вы писали:
GRF>Здравствуйте, k.o., Вы писали:
KO>>Здравствуйте, Galiulin Rishat Faimovich, Вы писали:
GRF>>>Вроде написал более рабочий вариант specification.hpp:
KO>>Да, уже лучше, только у нас, по прежнему, не поддерживается преобразование unique_ptr<A> -> unique_ptr<const A>, можно, конечно, сделать его явно:
GRF>Да, действительно выглядит плохо
. Но можно немного короче
Так ведь можно и ещё короче, если не использовать эти обёртки для параметров.
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>
Нужно чтобы работал вот такой код:
void sink1( in< std::unique_ptr< const A > > arg)
{
sink( in_( std::move( arg() ) ) );
}
Понятно, что саму обёртку можно, без проблем, передать дальше.
KO>>После этого можно будет вспомнить о существовании rvalue-references и необходимости поддерживать perfect forwarding.
GRF>При реализации мы к сожалению не ориетировались на новый стандарт С++
Ну это, как бы, заметно, хотя и странно для, подобного рода, инфраструктурного кода.