Поскольку вы обновили вопрос, я предлагаю сделать следующее:
void read(File& file)
{
SomeClass someObject;
file.radInto(&someObject);
// ...
}
void read(File&& file) { read(file); }
Это будет обрабатывать как lvalue, так и rvalues с минимальным повторением кода.
Я думаю, что ваша read
функция должна просто взять File&
:
void read(File& file) // I want to modify file
{
SomeClass someObject;
file.readInto(&someObject);//Modifies file
// do something with the data populated in someObject
}
Тогда вы можете позвонить:
// OK
std::shared_ptr<File> f1 = File::open("some_file_path");
read(*f1);
// OK
read( *File::open("some_file_path") );
Дополнительная выгода:функция не ограничена shared_ptr
и работает с любым File
независимо от способа управления его памятью.
В качестве альтернативы используйте ссылку переадресации :
template <typename T>
void read(T&& file)// I want to modify file
{
SomeClass someObject;
file->readInto(&someObject);//Modifies file
// do something with the data populated in someObject
}