#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
template<typename T, typename F = void*>
T* Cast(F* _ptr)
{
static_assert(std::is_pointer<F>::value, "포인터가 아님");
void* p_void = _ptr;
T* p_casted = static_cast<T*>(p_void);
if (!p_casted)
p_casted = reinterpret_cast<T*>(p_void);
return p_casted;
}
class A
{
protected:
int val = 10;
public:
A()
{
cout << "생성자 호출" << endl;
}
~A()
{
cout << "소멸자 호출" << endl;
}
public:
void Set(int _val) { val = _val; }
};
class B : public A
{
public:
void Print()
{
cout << val << endl;
}
};
int main()
{
// Heap 메모리에 동적 할당 삭제 필수
A* p_a = new A();
// 스코프 벗어나면 자동소멸 Stack 메모리
if (auto p_b = Cast<B>(p_a))
{
p_b->Print();
p_b->Set(20);
p_b->Print();
}
delete p_a;
// p_a = nullptr; 자유
int* p_int = new int(65);
char* p_ch = Cast<char>(p_int);
cout << "p_int 값 : " << *p_int << " p_ch 값 : " << (char)*p_ch << endl;
delete p_int;
return 0;
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ RVO NRVO 반환값 최적화 / Copy Elision(복사 생략) (0) | 2022.06.14 |
---|---|
C++ 가상함수 테이블 (Virtual Table) (0) | 2022.06.13 |
C++ SFINAE 여러 타입에 대응하는 템플릿 오버로딩 (0) | 2022.06.10 |
C++ 콜백 CallBack 함수 (0) | 2022.06.09 |
C++ 유니폼 초기화와 생성자 (0) | 2022.06.07 |