2013-07-05 3 views
0

libcurl을 사용하여 파일을 작성한 다음 컨테이너에 저장하는 함수를 작성하고 싶습니다. 컨테이너의 유형을 추출하기 위해 이터레이터를 사용하고 싶습니다. 이 기능은 다음과 같을 것이다 : userdata 내가 그 libcurl에서 나를 위해 쓰기 콜백으로 전달합니다 설정할 수있는 포인터입니다알 수없는 유형으로 변환하기

template <typename OutIt> 
bool download_to_container(const std::string& link, OutIt out) 
{ 
    //set the write callback 
    //perform the action 
    //return whatever 
} 

쓰기 콜백 서명 size_t(char*, size_t, size_t, void *userdata)의 함수이다.

userdata은 사용자가 download_to_container에 전달한 출력 반복기에 대한 포인터가됩니다. 이제 콜백이 호출되면 void*OutIt*으로 전송해야합니다. 반복기의 유형을 모르는 경우 어떻게해야합니까? 이것은 처음으로이 문제가 발생하므로 제발 쉽게 가십시오. :-)

나는 Microsoft Visual C++ Compiler Nov 2012 CTP (v120_CTP_Nov2012)을 사용하고 있습니다.

답변

1

언제든지 콜백 함수를 templatize 할 수 있습니다.

template<typename Iterator> 
size_t callbackFunc(char*, size_t, size_t, void *userdata) 
{ 
    Iterator it = *static_cast<Iterator*>(userdata); 

    // ... rest of code ... 
} 
+0

:

그래서, 대신 download_to_container에 대한 매개 변수로 OutIt 반복자를 사용하여, 당신은 관련 작업을 수행하는 클래스를 사용합니다. 나는 왜 내가 이것을 생각하지 않았는지 심각하게 알지 못한다. C API를 다루었 기 때문에 콜백이 함수 템플릿이 될 수 없다는 이상한 생각에 빠져있었습니다. 어, 이상 하네. 어쨌든 감사합니다! :) – Tuntuni

0

간단한 대답은 할 수 없다는 것입니다. "무엇을 주조하는지"를 알아야합니다.

물론이 문제를 해결하는 방법은 다양합니다. 나의 첫 번째 생각은 실제 스토리지를 구현하는 인터페이스 클래스를 사용하는 것이다. 내가 필요로 그냥 어떤

class VectorStorer 
{ 
    public: 
    static size_t store(char *ptr, size_t size, size_t nmemb, void *userdata) 
    { 
     VectorStorer *self = static_cast<VectorStorer *>(userdata); 
     return self->do_Store(ptr, size, nmemb); 
    } 

    private: 
    vector<char> v; 
    size_t do_store(char *ptr, size_t size, size_t nmemb) 
    { 
     ... store stuff in vector v. 
     return size; 
    } 
}; 

template <typename StoreT> 
bool download_to_container(const std::string& link, StoreT& storer) 
{ 
    curl_opt(ch, CURLOPT_WRITE_DATA, &storer); 
    curl_opt(ch, CURLOPT_WRITEFUNCTION, &storer.store); 
    //perform the action 
    //return whatever 
} 

VectorStorer vs; 
download_to_container("www.example.com", vs); 
관련 문제