2014-10-14 11 views
8

Rozważmy następujący wiersz kodu:Czy std :: make_unique może być używany z interfejsem abstrakcyjnym?

auto source1 = std::unique_ptr<IGpsSource>(new GpsDevice(comPort, baudrate)); 
auto source2 = std::unique_ptr<IGpsSource>(new GpsLog(filename)); 

Jak to może być napisany przy użyciu nowej funkcji std :: make_unique, obsługiwanej przez VS 2013? Czy to w ogóle możliwe? *

* Problem polega na tym, że nie wiem, jak powiedzieć "make_unique", jaki rodzaj obiektu można utworzyć. Ponieważ tylko parametry konstruktora są przekazywane, wydaje się, że nie ma kontroli nad tym ...

+0

Czy to nie C++ 14? Myślałem, że VS2013 go nie obsługuje –

+1

@MarcoA. VS2013 obsługuje kilka bitów C++ 14, a 'make_unique' jest jednym z nich. – Angew

+0

@Angew Nie wiedziałem tego. Dzięki! –

Odpowiedz

12

Tak, możesz oczywiście użyć do tego celu make_unique, ale nie jest to tak przydatne, jak byś chciał. Masz następujące opcje:

std::unique_ptr<IGpsSource> source1 = std::make_unique<GpsDevice>(comPort, baudrate); 
auto source2 = std::unique_ptr<IGpsSource>{ std::make_unique<GpsLog>(filename) }; 

Powiedziałbym, że prawdziwe pytanie brzmi "dlaczego tego chcesz?".

  1. przeciwieństwie make_shared, make_unique ma żadnych korzyści alokacji ponad new. Więc jeśli potrzebujesz kontroli nad typem wskaźnika, to, co robisz, jest w porządku.

  2. Dlaczego w pierwszej kolejności trzeba wpisać wskaźnik na IGpsSource? Konieczna jest niejawna konwersja z rvalues ​​o wartościach rvalues ​​ do do. Więc jeśli w rzeczywistości dzwonisz pod numer make_unique, aby zainicjować wskaźnik IGpsSource, będzie działał dobrze. A jeśli chcesz gdzieś przenieść wskaźnik, będziesz musiał to zrobić i wtedy konwersja może się powtórzyć.

+2

Argument dotyczący bezpieczeństwa wyjątków [z tej odpowiedzi] (http://stackoverflow.com/a/20895705/673852) nadal ma zastosowanie do 'make_unique', a nie tylko do' make_shared'. Tak więc 'make_unique ()' powinno być preferowane w porównaniu z 'unique_ptr (new Xyz)'. – Ruslan

+0

@Ruslan Należy zwrócić uwagę, że kryterium bezpieczeństwa wyjątków dotyczy wielokrotnych alokacji wykonywanych w pojedynczym wyrażeniu. Przypadek OP jest zupełnie inny: mają tylko jedną alokację i chcą precyzyjnej kontroli nad typem wskaźnika. – Angew

Powiązane problemy