投射到未知类型

时间:2013-07-05 22:53:28

标签: c++ templates casting libcurl

我想编写一个函数,它将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)

2 个答案:

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