Na ile sposobów można przeładować funkcję używając tylko dwóch typów danych?

Może dokładniej. Muszę stworzyć 6 przeładowanych funkcji z listą jednego do trzech parametów. Coś w ten deseń:

int s(const int& n);
double s(double l);
int s(int wyk, int podst = 10); 
int s(const double& l, int dokl = 0); 
double s(int k, double r);
double s(double l1, double l2, double l3);
double s(const double& l1, const double& l2, const double& l3); 

Np. pierwsza funkcja ma rekurencyjnie obliczać silnię. Jak określać typy parametrów, aby wywołanie funkcji było jednoznaczne?
Jak wywołać rekurencyjnie pierwszą z zadeklarowanych funkcji, aby kompilator nie chciał wywołać jednocześnie pierwszej, drugiej, trzeciej i czwartej?
Coś zacząłem kombinować ze stałymi referencjami, ale zdaje się, że nie daje to efektu...

To pytanie nie jest dobrze sprecyzowane, problem w tym, że nie do końca to ogarniam, a program powinienem wysłać już jakiś czas temu. Za wszelką pomoc (w tym wskazanie na to co powinienem doczytać) bardzo dziękuję!