35. Modern C++: Factory
// C++98
class WriterFactory
{
public:
IWriter* Create(const string& where)
{
if (where == "cout")
return new CoutWriter();
if (where == "dbgview")
return new DbgViewWriter();
if (where == " null")
return new NullWriter();
throw exception("where to write?");
}
};
35
36. Modern C++: Factory
// C++11-14
class WriterFactory
{
public:
unique_ptr<IWriter> Create(const string& where)
{
static map<string, function<unique_ptr<IWriter>()>> m =
{
{"cout", []{return make_unique<CoutWriter>()}},
{"dbgview", []{return make_unique<DbgViewWriter>()}},
{"null", []{return make_unique<NullWriter>()}}
};
return m.at(where)(); // può sollevare eccezione
// oppure una policy diversa
}
36
};
54. Outline
• C++11, benvenuto nel team!
– C++98 C++11 & snippet C#
• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++
• Alcune linee guida
54
55. Alcune linee guida
• Devo migrare tutto subito?
– No, intanto assicurati di cosa supporta il tuo
compilatore.
– Inizia migrando le cose deprecate (e.g. auto_ptr).
– Aggiungi qualche test su quello che stai
modificando.
– Vale sempre il principio del boyscout…
55
56. Alcune linee guida
• Il mio compilatore non supporta alcune
feature del C++11. Che devo fare?
– Se puoi, pianifica una migrazione del compilatore.
– Individua cosa potrà beneficiare del C++11 e come
lo riscriveresti.
– Metti dei reminder per quando migrerai, tipo:
//TO-DO-CPP11: …
56
57. Alcune linee guida
• Il miglior consiglio per usare C++11/C++14?
– Provalo!
– Il materiale di qualità sul C++ è aumentato.
– Frequenta isocpp.org
– Frequenta italiancpp.org
57
58. Marco & Paolo
Marco Arena
marco@italiancpp.org
http://marcoarena.wordpress.com
Paolo Polce
paolo@webshell.it
@paolopolce
webshell.it
agileworks.it
58
62. Bonus: non-member begin/end
// C++98
vector<int>::iterator it = vec.begin();
int arr[] = {1,2,3,4,5};
arr.begin(); // eh ???
// C++11
auto it = begin(vec);
auto it = begin(arr); // ok!
62
63. Bonus: make_unique (1)
// C++14
auto car = make_unique<Car>(arg1)
• auto-everything syntax
• Exception-safety:
void func(unique_ptr<Car> c1, unique_ptr<Car> c2);
func(unique_ptr<Car>{new Car{}}, unique_ptr<Car>{new Car{}});
• Le istruzioni per creare i due Car* possono essere riordinate
dal compilatore.
63
64. Bonus: make_unique (2)
func(unique_ptr<Car>{new Car{}}, unique_ptr<Car>{new Car{}});
Esempio di possibile esecuzione:
1. Allocazione memoria per la prima Car
2. Allocazione memoria per la seconda Car
3. Costruzione prima Car
4. Costruzione seconda Car
5. Costruzione primo unique_ptr
6. Costruzione secondo unique_ptr
Che succede se 4 tira un’eccezione? Memory leak della prima Car!
Se chiamiamo due funzioni (come make_unique), il compilatore è costretto
a fare 1,2,5 insieme e poi 3,4,6! Più dettagli a questo link (Sutter)
64