Listing 7: Generalization via traits

namespace stlsoft
{
  template <typename T>
  struct string_access_traits
  {
    static typename T::value_type const *c_str(T const &s)
    {
      return s.c_str();
    }
    static size_t length(T const &s)
    {
      return s.length();
    }
  };

  template <>
  struct string_access_traits<char const *>
  {
    static char const *c_str(char const *s)
    {
      return s;
    }
    static size_t length(char const *s)
    {
      return strlen(s);
    }
  };
}