Re: Crazy Local Class
<cpluslearn@gmail.com> wrote in message
news:e730ba2e-6ac8-4063-945c-bcc06518e3fe@t54g2000hsg.googlegroups.com...
Hi,
I have a local class inside a function template. I am able to wrap
any type in my local class. Is it legal C++? What type of class is
Local? Is it a class template or regular class?
Thanks in advance.
--dhina
---------------------------------------------------------------------------------------------------------------------------------------------
class Foo
{
public:
virtual ~Foo() {}
virtual void print() = 0;
};
template< typename T >
Foo* wrap(const T& t)
{
class Local : public Foo
{
public:
Local(const T& t):val_(t) { }
void print()
{
cout << "In Local::print()" << val_ << endl;
}
private:
T val_;
};
return new Local(t);
}
int main(void)
{
int x = 50;
Foo* ptr = wrap(x);
ptr->print();
^^^^^^^^^^^^^^^^^^^
delete ptr;
std::string s("wrap");
ptr = wrap(s);
ptr->print();
^^^^^^^^^^^^^^^^^^^
delete ptr;
}
You have memory leaks. BTW, excuse me for being so dense, but what
advantages does this technique have over something like:
____________________________________________________________________
#include <iostream>
#include <string>
struct foo_impl {
virtual ~foo_impl() = 0;
virtual void print() const = 0;
};
foo_impl::~foo_impl() {
std::cout << "In (" << this <<
")->foo_impl::~foo_impl()" << std::endl;
}
typedef foo_impl const& foo;
template<typename T>
class wrapper : public foo_impl {
T m_obj;
void print() const {
std::cout << "In (" << this <<
")->wrapper<T>::print - " << m_obj << std::endl;
}
public:
wrapper(T const& obj)
: m_obj(obj) {
}
~wrapper() {
std::cout << "In (" << this <<
")->wrapper<T>::~wrapper() - " << m_obj << std::endl;
}
};
template<typename T>
static wrapper<T>
wrap(T const& obj) {
return wrapper<T>(obj);
}
int main(void) {
int x = 5;
foo fx = wrap(x);
fx.print();
std::string s("wrap");
foo fs = wrap(s);
fs.print();
return 0;
}
____________________________________________________________________
Thanks.