See: Modern C++ Design