template optional foo() { ... optional o; if(x) { o = p1(); //Use o o = p2(); //Use o o = q1(); //Do 1 } if(y) { o = q2(); //Do 2 } if(o) { //Do 3 } switch ( cond ) { case a : o = foo1(); break ; case b : o = foo2(); break ; case c : o = foo3(); break ; case d : o = foo4(); break ; case e : o = foo5(); break ; default : // o remains uninitialized } if(o) { //Do 4. } o = foo8(); //Do 5. }