
#include <type.h>
#include <iostream>



/////////////////////////////////////////
// Definition of ImplT<A>
/////////////////////////////////////////

template<>
struct KImplDef<A>
{
    KImplDef() { std::cout << "A created\n"; }
    ~KImplDef(){ std::cout << "A destroyed\n"; }

    void foo() { std::cout << "Impl<A>::foo() \n"; }
    void foo() const { std::cout << "Impl<A>::foo() const \n"; }
};

/////////////////////////////////////////
// class A definition
/////////////////////////////////////////
A::A()
{}

void A::foo(){ d->foo(); }

void A::foo() const { d->foo(); }



/////////////////////////////////////////
// main
/////////////////////////////////////////


int main()
{
    A* a = new A;
    const A* ca = new A;

    a->foo();
    ca->foo();

    delete a;
    delete ca;

    return 0;
}
