Figure 1: The Meyers algorithm.
Given a class T and a function f: if (f needs to be virtual) { f should be a member function of T; } else if ( (f is operator>>) or (f is operator<<) or (f needs type conversions on its left-most argument) ) { f should be a non-member function; if (f needs access to non-public members of T) { f should be a friend of T; } } else if (f can be implemented via T's public interface) { f should be a non-member function; } else { f should be a member function of T; }