The behavior you are referring to is documented here, and it doesn't seem to be any builtin functionality for handling this case.
According to this you need to implement this yourself. Below is a short example code of how this can be done.
#include <iostream>
#include <vector>
#include <algorithm>
#include <ginac/ginac.h>
int main()
{
using namespace GiNaC;
symbol x("x");
ex poly(-3*x-5+power(x,2));
std::vector<ex> terms(poly.begin(), poly.end());
std::sort(std::begin(terms), std::end(terms),
[x](const ex& lhs, const ex& rhs) { return lhs.degree(x)>rhs.degree(x); });
bool first{ true };
for(auto term : terms) {
if( first ) first = false;
else if( term.coeff(term)>0) std::cout << '+' ;
std::cout << term;
}
std::cout << std::endl;
}