Code:
template <typename Derived>
class base
{
protected:
Derived const &
derived(void) const
{
return static_cast<Derived const&>(*this);
}
Derived &
derived(void)
{
return static_cast<Derived&>(*this);
}
public:
template <typename Type>
void
put(Type const & data) const
{
return derived().put(data);
}
};
#include <iostream>
class test : public base<test>
{
public:
template <typename Type>
void
put(Type const & data) const
{
std::cout << data << std::endl;
}
};
template <typename Derived, typename Type>
void
put(base <Derived> const & rhs, Type const & data)
{
rhs.put(data);
}
int
main(void)
{
put(test(), "foo");
put(test(), 1024);
}