Ideas
Module policy_group
We could combine all the Axis Is templates into a single template. Since the trait argument will automatically specify the axis to be used, it is not necessary to specify that axis in the template functor's name. We could even combine this with SocketPolicyIsBaseOf.
Class senf::BSDAddressingPolicyMixin< Address >
We could explicitly provide open_sockaddr_p() and close_sockaddr_p() members. sockaddr_p could always return a const * whereas open_sockaddr_p should return a non-const pointer. The close operation would then explicitly signal, that the new value should be incorporated into the class. With our current implementation, the close member would be a no-op, however this should free us from using the sockaddr values as a direct storage representation of the address.
Class senf::ClientSocketHandle< SPolicy >
Give SocketHandle (and therefore ClientSocketHandle and ServerSocketHandle) a protocol() template member and an additional template arg Policies. This arg should be a typelist of policy classes which can be accessed. You use protocol<ProtocolClass>() to access a protocol class. Policies can of course be underspecified or even empty.
Class senf::INet6SocketAddress
Implement a INet6Address_ref class which has an interface identical to INet6Address and is convertible to INet6Address (the latter has a conversion constructor taking the former as arg). This class however references an external in6_addr instead of containing one itself. This can be used in INet6SocketAddress to increase the performance of some operations.
File SocketPolicy.hh
Creating a new Socket will create 3 new instances (The handle, the body, the policy) of which 2 (argh) (body, policy) live on the heap. This is expensive. We should convert all the policy classes to singletons and assign the same instance to all socket bodies with the same policy. This would reduce the number of heap allocations per socket handle to one (which is already optimized using the pool_alloc_mixin)