Добавить неявное преобразование из unique_ptr <T> в T *
Общий вопрос: Не вдаваясь в подробности, является ли это хорошей идеей, как я могу добавить оператор неявного преобразования в класс, который уже был определен? Например, скажем, чтоЯ хочу, чтобы unique_ptr <T> неявно конвертировался в T *, но я не могу просто добавить оператор преобразования члена, потому что не могу изменить определение класса unique_ptr.
Опции:
Есть ли какой-нибудь c ++ voodoo, который я могу использовать, чтобы это произошло без создания функции-члена?
Ответ пока что: НЕТ.
Невозможно добавить неявное преобразование из типа, который нельзя изменить в коде.
Просто ... грусть
Могу ли я получить из std :: unique_ptr и добавить свою собственную функцию преобразования членов? Есть ли серьезные недостатки в этом?
Ответ пока что: да (от vsoftco)
Недостатки еще предстоит определить. До сих пор наследование от std :: unique_ptr, наследование его конструкторов и объявление оператора неявного преобразования работали великолепно, едва ли нужно писать какой-либо код.
Должен ли я жить без этого всю оставшуюся жизнь?
Ответ пока что: посмотрим ...
Если я смогу запустить вариант 2 и запустить его без каких-либо серьезных побочных эффектов или обременений, я протестирую его некоторое время и сообщу, думаю ли оно того. Посмотрим!
Пример кода:
#include <algorithm>
#include <memory>
#include <vector>
struct MyClass
{
MyClass(int v) : value(v) {}
int value;
};
int main()
{
auto vec = std::vector<std::unique_ptr<MyClass>>();
vec.push_back(std::make_unique<MyClass>(1));
vec.push_back(std::make_unique<MyClass>(2));
// error C2664: 'void (__vectorcall *)(MyClass *)' : cannot convert argument 1 from 'std::unique_ptr<MyClass,std::default_delete<_Ty>>' to 'MyClass *'
std::for_each(std::begin(vec), std::end(vec), [](MyClass* myClass)
{
myClass->value += 3;
});
}