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

KO>>>>Попробуйте повторить этот пример используя ваш specification.hpp.


GRF>Вроде теперь ваш пример работает


Зато, теперь не работает добавление константности:
void
sink2( in< const std::unique_ptr< const A > > arg )
{
  // would like to get compile error for attempts to modify arg, e.g.:
  // arg().release();
}

void
sink1( in< std::unique_ptr< const A > > arg )
{
    std::cout << "sink1 owns pointer to A: " << arg( ).get( ) << std::endl;
    sink2( in_( std::move( arg() ) ) );
    std::cout << "sink1 passed ownership to sink2: " << arg( ).get( ) << std::endl;
}


И, хотя, реализовать это нетрудно:

#include <type_traits>
...
template< class Type >
class in
{
public:

    in( const in<typename std::remove_const<Type>::type>& other)
    : value_(other())
    {
    }

...
};


Возникает закономерный вопрос: нафига козе баян зачем нам вся эта шаблонная магия с классом in, если мы теперь всё-равно можем менять передаваемые аргументы, а константность нужно добавлять самому, точно также, как и с обычными параметрами? Собственно, в этом и заключается "концептуальная проблема" вашего подхода: он либо слишком ограничивающий, либо, мало чем отличается (кроме лишней писанины) от обычной передачи параметров.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.