2013-07-05 72 views
0

我想写一个函数,它会使用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是指向我可以设置的libcurl将传递到我写回调。

这个userdata将是一个指向用户已经传递到download_to_container的输出迭代器的指针。现在,一旦回调被调用,我必须将void*转换为OutIt*。如果我不知道迭代器的类型,我该如何做到这一点?这是我第一次遇到这个问题,所以请在我身上轻松一下。 :-)我正在使用Microsoft Visual C++ Compiler Nov 2012 CTP (v120_CTP_Nov2012)

回答

1

你总是可以模拟回调函数。

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

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

正是我需要的。我真的不知道为什么我没有想到这一点。我被这个奇怪的想法困住了,因为我正在处理C API,所以回调函数不能作为函数模板。呃,很奇怪。不管怎样,谢谢! :) – Tuntuni

0

简单的答案是,你不能。你需要知道“你在投什么”。

当然,有各种方法可以解决这个问题。我的第一个想法是使用实​​现实际存储的接口类。

因此,而不是使用OutIt迭代器为您download_to_container参数,您使用的类,它的相关操作:

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);