필자는 XML 데이터를 읽고 노드 이름별로 액세스를 제공하는 "CDownloader"클래스를 가지고 있습니다.일반 "getData"함수를 작성하는 방법은 무엇입니까?
BOOL CDownloader::getInteger (const CString &name, int *Value);
BOOL CDownloader::getImage (const CString &name, BOOL NeedCache, CImage *Image);
BOOL CDownloader::getFont (const CString &name, CFont *Font);
내가 CDownloader 클래스를 변경할 수 없습니다 : 그것은 몇 가지 게터 기능 같은 것을 특징으로한다. 대신 실제 이름이 아닌 bool 플래그를 사용하여 항목을 다운로드하는 일부 함수를 작성하려고합니다. 이런 식으로 뭔가 :
BOOL DownloadFont(const CDownloader &Loader, bool Flag, CFont *Font)
{
if (Flag) {
// first try the "name_1"
if (Loader.getFont("name_1", Font)) return TRUE;
}
// if "name_1" fails or disabled by flag, try "name_2"
return Loader.getFont("name_2", Font);
}
내가 쓸 수있는 다운로드 (폰트 | 정수 | 이미지) 기능 separatly, 그러나 이것은 코드 중복 발생합니다. 내 생각은 템플릿을 작성하는 것이지만 여전히 손실이 있습니다. 어떻게 CDownloader 클래스에서 어떤 메서드를 호출해야합니까? 각 데이터 유형에 대한 템플릿을 특수화하려면 코드 복제를 다시 고집해야합니다. getter funciton을 "함수 포인터에 대한 포인터"매개 변수로 전달하려면? 하지만 Getter 서명은 CDownloader에서 다릅니다.
요약하면 다음과 같습니다. CDownloader에 대한 일반적인 래퍼를 작성할 수 있습니까? 아니면 "get ***"함수마다 코드를 복제해야합니까? 미리 감사드립니다!
피하고자하는 복제본을보기가 어렵습니다. 표시하는 "DownloadFont()"에는 이름을 선택하는 것과 CDownloader에서 적절한 함수를 호출하는 두 줄이 있습니다. 나는 이름이 다른 타입 (다른 라인이 될 것임)에서 다른 것으로 가정하고, 두 번째 라인은 서로 다른 서명을 가진 다른 CDownloader 멤버를 호출하기 때문에 두 번째 라인도 가지고있다. 다른 것). –
사용 예제가 좀 더 복잡해졌습니다. 이것이 내가 성취하려고하는 것입니다. 그리고 저는 회원 함수에서만 다른 5 개의 "get ..."함수를 가지고 있는데, CDownloader를 호출했습니다 ... – SadSido