Listing 6
template<typename CharT, typename CharTraits, typename Allocator>
std::size_t const length(std::basic_string<CharT, CharTraits, Allocator> const &str)
{ return str.length(); }
std::size_t const length(char)
{ return 1; }
template<typename CharT>
std::size_t const length(CharT const *str)
{ return std::char_traits<CharT>::length(str); }
template<typename Res, typename T1, typename T2>
std::size_t const length(addition<Res, T1, T2> const a)
{ return length(a.first()) + length(a.second()); }