You could overload the function but have a single "base" function which gets called in the others, like:
// "base" function:
int combine(int a, float b, char c)
{
return a+b+c;
}
// define "forwarders" for reordered function types:
inline int combine(float b, int a, char c) { return combine(a, b, c); }
inline int combine(int a, char c, float b) { return combine(a, b, c); }
inline int combine(float b, char c, int a) { return combine(a, b, c); }
inline int combine(char c, int a, float b) { return combine(a, b, c); }
inline int combine(char c, float b, int a) { return combine(a, b, c); }
As you told us in the comments, you want to further overload this with another combination of three types; hence you can consider wrapping those five lines which define the overloads in a macro:
#define OVERLOAD_REORDERED(Treturn, functionName, T1, T2, T3) \
inline Treturn functionName(T2 b, T1 a, T3 c) { return functionName(a, b, c); } \
inline Treturn functionName(T1 a, T3 c, T2 b) { return functionName(a, b, c); } \
inline Treturn functionName(T2 b, T3 c, T1 a) { return functionName(a, b, c); } \
inline Treturn functionName(T3 c, T1 a, T2 b) { return functionName(a, b, c); } \
inline Treturn functionName(T3 c, T2 b, T1 a) { return functionName(a, b, c); } \
and then only write:
int combine(int a, float b, char c)
{
return a+b+c;
}
OVERLOAD_REORDERED(int, combine, int, float, char)
Since you probably split this into declarations (.h) and definitions (.cpp), you can put the macro call in the header, like this:
// .h:
int combine(int a, float b, char c);
OVERLOAD_REORDERED(int, combine, int, float, char)
// .cpp:
int combine(int a, float b, char c)
{
return a+b+c;
}