#include <iostream>
using namespace std;

template<class T>
class A
{
private:
	T m_value;
    
public:
    A(const T & input)
        : m_value(input)
    {}
    
    void print()
    {
        cout << m_value << "\n";
    }
};

//포인터의 경우에만 특수화
template<class T>
class A<T*>
{
private:
	T* m_value;
    
public:
    A(T * input)
        : m_value(input)
    {}
    
    void print()
    {
        cout << *m_value << "\n";
    }
};

int main()
{
    A<int> a_int(123);
    a_int.print();
    
    int temp = 456;
    
    A<int*> a_int_ptr(&temp); // 포인터인 경우에만 특수화하고 싶다.
    a_int_ptr.print();
    
    double temp_d = 3.141592;
    A<double*> a_double_ptr(&temp_d);
    a_double_ptr.print();
    
    return 0;
}