> I give up. I can't work out how to create this functionality
> for an arbitary number of arguments.
You need to use recursion, not loops. I'm not sure how the syntax works exactly,
but it might look something like this:
bool ordered(T1, T2, Trest ...)(T1 first, T2 second, Trest rest) {
    return (first < second) && ordered(second, rest);
}