(내용을 핵심만 간략하게 정리한 것)
위와 같은 형태의 API가 기존에 있었을 때, 이 API의 파라미터를 IObject* 로 받도록 바꾸고 싶지만 기존에 이미 만들어진 코드도 제대로 빌드되고 정상 동작하게 하려면 어떻게 해야 하는가?class IObject{};void RegisterObject(const IObject& obj){}
물론 C 적으로는 다음과 같은 방법이 있을 수 있다.
void RegisterObject(const IObject& obj) __attribute__((deprecated)); // __declspec(deprecated)void RegisterObject(const IObject& obj){}
void RegisterObject(IObject* obj){}
template <typename T>struct ParamAdaptor{inline ParamAdaptor(const T& obj): param(const_cast<T*>(&obj)){}inline ParamAdaptor(T* obj): param(obj){}T* param;};class IObject{}void RegisterObject(ParamAdaptor<IObject> objAdaptor){}
이렇게 만들게 되면 다음의 코드가 모두 정상적으로 동작한다.
IObject obj1;RegisterObject(obj1);RegisterObject(&obj1);IObject* obj2 = new IObject;RegisterObject(*obj2);RegisterObject(obj2);
물론 이것은 아이디어일뿐, API 사용자가 이 API를 사용할 때 헤더의 선언과의 괴리를 느끼게 되므로 이 방법이 채택되지는 않았다.
Posted by 안영기