Something like that will do nicely:
template<bool bonus = false>
void MyFunction()
{
foo();
bar();
if (bonus) { doBonusStuff(); }
foobar();
}
Call it via:
MyFunction<true>();
MyFunction<false>();
MyFunction(); // Call myFunction with the false template by default
The “ugly” template can be all avoided by adding some nice wrappers to the functions:
void MyFunctionAlone() { MyFunction<false>(); }
void MyFunctionBonus() { MyFunction<true>(); }
You can find some nice informations on that technique there. That is an “old” paper, but the technique in itself stay totally right.
Provided you have access to a nice C++17 compiler you can even push further the technique, by using the constexpr if, like that:
template <int bonus>
auto MyFunction() {
foo();
bar();
if constexpr (bonus == 0) { doBonusStuff1(); }
else if constexpr (bonus == 1) { doBonusStuff2(); }
else if constexpr (bonus == 2) { doBonusStuff3(); }
else if constexpr (bonus == 3) { doBonusStuff4(); }
// Guarantee that this function will not compile
// if a bonus different than 0,1,2,3 is passer
else { static_assert(false);},
foorbar();
}