Listing 2: Adaptive veneer: emulating standard string

template <typename S>
class c_str_veneer
  : public S
  , is_veneer<S, c_str_veneer<S> >
{
public:
  typedef S                       parent_class_type;
  typedef typename S::value_type  value_type;

  // Other methods, including constructors
  ...

  value_type const *c_str() const;
};

template <>
inline LPCTSTR c_str_veneer<CString>::c_str() const
{
  return *this;
}