Если функция не возвращает значение (ссылку или указатель), вам нужны константные перегрузки в первую очередь? Кажется, единственная причина иметь два - это получить постоянную или неконстантную ссылку из класса. В противном случае одной только константной версии должно быть достаточно.
Что касается улучшения идиомы, как насчет того, чтобы несколько помощников по шаблонам вместо вас делали вывод типов:
template <class T>
const T& add_const(T& t) { return t; }
template <class T>
T& remove_const(const T& t) { return const_cast<T&>(t); }
class Foo
{
int foo;
public:
const int& get() const
{
//non-trivial work
return foo;
}
int& get()
{
return remove_const(add_const(*this).get());
}
};
Преимущество больше, если имена типов длиннее.