Listing 3
template<typename R1>
concat_string< addition<std::string, R1, char const> > const
operator+(concat_string<R1> const &first, char const second)
{
typedef concat_string< addition<std::string, R1, char const> > Ret;
return Ret(Ret::value_type(first.data(), second));
}
template<typename R2>
concat_string< addition<std::string, char const, R2> > const
operator+(char const first, concat_string<R2> const &second)
{
typedef concat_string< addition<std::string, char const, R2> > Ret;
return Ret(Ret::value_type(first, second.data()));
}
template<typename R1>
concat_string< addition<std::string, R1, char const *> > const
operator+(concat_string<R1> const &first, char const *second)
{
typedef concat_string< addition<std::string, R1, char const *> > Ret;
return Ret(Ret::value_type(first.data(), second));
}
template<typename R2>
concat_string< addition<std::string, char const *, R2> > const
operator+(char const *first, concat_string<R2> const &second)
{
typedef concat_string< addition<std::string, char const *, R2> > Ret;
return Ret(Ret::value_type(first, second.data()));
}
template<typename R1>
concat_string< addition<std::string, R1, std::string> > const
operator+(concat_string<R1> const &first, std::string const &second)
{
typedef concat_string< addition<std::string, R1, std::string> > Ret;
return Ret(Ret::value_type(first.data(), second));
}
template<typename R2>
concat_string< addition<std::string, std::string, R2> > const
operator+(std::string const &first, concat_string<R2> const &second)
{
typedef concat_string< addition<std::string, std::string, R2> > Ret;
return Ret(Ret::value_type(first, second.data()));
}
template<typename R1, typename R2>
concat_string< addition<std::string, R1, R2> > const
operator+(concat_string<R1> const &first, concat_string<R2> const &second)
{
typedef concat_string< addition<std::string, R1, R2> > Ret;
return Ret(Ret::value_type(first.data(), second.data()));
}