API의 deprecate 방법

어제 API 관련된 스펙 논의를 하다가 다음과 같은 조건의 해결 방법에 대한 논의가 있었다.
(내용을 핵심만 간략하게 정리한 것)


class IObject
{
};

void RegisterObject(const IObject& obj)
{
}

위와 같은 형태의 API가 기존에 있었을 때, 이 API의 파라미터를 IObject* 로 받도록 바꾸고 싶지만 기존에 이미 만들어진 코드도 제대로 빌드되고 정상 동작하게 하려면 어떻게 해야 하는가?

물론 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 안영기

2012/08/25 11:10 2012/08/25 11:10
Response
0 Trackbacks , 1 Comments
RSS :
http://smgal.ismine.net/tc_191/blog1/rss/response/43

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

« Previous : 1 : ... 6 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : ... 50 : Next »

블로그 이미지

게임 개발을 기반으로 한, 잡다한 개발 기록 저장소

- 안영기

Notices

Archives

Authors

  1. 안영기

Recent Comments

Recent Trackbacks

Calendar

«   2024/10   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Site Stats

Total hits:
247392
Today:
2
Yesterday:
32