¿Cómo puedo especificar claramente qué argumentos estoy pasando y cuáles siguen siendo los predeterminados?

Preguntado por esto: Argumento predeterminado en c ++

Di que tengo una función como esta:void f(int p1=1, int p2=2, int p3=3, int p4=4);

Y quiero llamarlo usando solo algunos de los argumentos; el resto serán los valores predeterminados.

Algo como esto funcionaría:

template<bool P1=true, bool P2=true, bool P3=true, bool P4=true>
void f(int p1=1, int p2=2, int p3=3, int p4=4);
// specialize:
template<>
void f<false, true, false, false>(int p1) {
  f(1, p1);
}
template<>
void f<false, true, true, false>(int p1, int p2) {
  f(1, p1, p2);
}
// ... and so on. 
// Would need a specialization for each combination of arguments
// which is very tedious and error-prone

// Use:
f<false, true, false, false>(5); // passes 5 as p2 argument

Pero requiere demasiado código para ser práctico.

¿Hay una mejor manera de hacer esto

Respuestas a la pregunta(4)

Su respuesta a la pregunta