대충 검색으로 찾아보니간
template<typename T>
class CSingleton
{
public:
static T* GetInstance()
{
std::call_once(m_onceFlag, [] {
m_pInstance.reset(new T);
});
return m_pInstance.get();
}
private:
static std::shared_ptr<T> m_pInstance;
static std::once_flag m_onceFlag;
};
template<typename T> std::shared_ptr<T> CSingleton<T>::m_pInstance = NULL;
template<typename T> std::once_flag CSingleton<T>::m_onceFlag;
이렇게 구현해놨더라고
대충은 알겠는데
여기서 템플릿으로 해논 이유가 뭐임?
template<typename T> std::shared_ptr<T> CSingleton<T>::m_pInstance = NULL;
template<typename T> std::once_flag CSingleton<T>::m_onceFlag;
이런씩으로 해놨는데 이해가 잘안가네
그리고 생성자랑 소멸자 구현안해놨던데 스마트포인터쓴다고 해서 생성자랑 소멸자 구현안해놓을이유가 없지않음?
너무 으릅당...
좀 알려줄사람있음?
3개의 댓글
무분별한 사용은 차단될 수 있습니다.
천궁딸린라이젠
스마트 포인터가 템플릿임. 타입과 관계 없이 다 돌아가야 해서 그런거고
싱글톤은 그런 스마트 포인터의 타입을 하나로 제한두지 않고 마찬가지로 여러 타입에 대해 작동해야 하니까 템플릿으로 함.
만약에 Int에 대해서만 하고 싶으면 구현 할 때 Int 타입 때려 박으면 거기에 대해서만 동작함.
생성자 소멸자 없는건 그냥 default를 쓰면 그럴 수 있음. 따로 꼬일 여지 없고 상속 안하며 내부 field들이 zero initialize로도 충분하면 뭐
굳이 만들 필요는 없지.
씨발좆같은개새끼
그래서 그런건가? 근대 지금 내가 만들고 있는게 타입마다 각자 싱글톤으로 구현하려고 해서 굳이 템플릿으로 만들어야되나 싶어서 그럼
천궁딸린라이젠
여러 타입에 대해 동일한 작업을 구현하기 위해 반복적인 작업을 하는 것을 줄이기 위해 나온 것이니까 반대로 모든 타입에 작동하는 싱글톤을 구현하는 클래스인거지 저건.
따로 하려면 위에도 말했지만 싱글톤 클래스에 template 선언 없애고 대신 내부에 있는 template 변수들마다 원하는 타입을 넣어주면 될듯