我想编写一个函数,它将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)
。
答案 0 :(得分:1)
您可以随时模板化回调函数。
template<typename Iterator>
size_t callbackFunc(char*, size_t, size_t, void *userdata)
{
Iterator it = *static_cast<Iterator*>(userdata);
// ... rest of code ...
}
答案 1 :(得分: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);