. , External , Internal . . , .
, . , . , .
, :
std::ostream& operator<<(std::ostream& os, External<int>::Internal const& i)
{
return os << i.internal_value;
}
. , , .
, . External . , inline, - ( ):
class Internal {
public:
Internal(const External& e) : internal_value{e.value} {}
private:
std::ostream& print(std::ostream&) const;
friend std::ostream& operator<<(std::ostream& os, Internal const& i)
{
return i.print(os);
}
T internal_value;
};
template<typename T>
std::ostream& External<T>::Internal::print(std::ostream& os) const {
return os << internal_value;
}