Здравствуйте, 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, если мы теперь всё-равно можем менять передаваемые аргументы, а константность нужно добавлять самому, точно также, как и с обычными параметрами? Собственно, в этом и заключается "концептуальная проблема" вашего подхода: он либо слишком ограничивающий, либо, мало чем отличается (кроме лишней писанины) от обычной передачи параметров.