在C+中以void*形式传递数据+; 我在C++程序中使用卷曲。Curl可以存储传递给它的“用户数据”,这样当我收到curlhttp回调时,我就可以再次检索这个用户数据

在C+中以void*形式传递数据+; 我在C++程序中使用卷曲。Curl可以存储传递给它的“用户数据”,这样当我收到curlhttp回调时,我就可以再次检索这个用户数据,c++,curl,interface,C++,Curl,Interface,Curl将以void*的形式存储此数据。我希望能够将数据传递给如下函数: void SomeFunction( const std::string& url, const std::string& username, const std::string& password, void* userData) { //Pass userData to curl..blah blah } 我的问题是,正确的、正确的C++方法是如何将数据作为一个空洞传递的? 我是否应该

Curl将以void*的形式存储此数据。我希望能够将数据传递给如下函数:

void SomeFunction( const std::string& url, const std::string& username, const std::string& password, void* userData)
{
    //Pass userData to curl..blah blah
}
我的问题是,正确的、正确的C++方法是如何将数据作为一个空洞传递的? 我是否应该有这样一个界面:

    class ICurlUserData
    {
    public:
        virtual void SetCurlData( void* pUserData ) = 0;
        virtual void* GetCurlData( void ) = 0;
    };
    class CurlUserData
    {
    public:
        CurlUserData() : m_userData(nullptr){};
        virtual ~CurlUserData(){};

        virtual void SetCurlData( void* pUserData ){ m_userData = pUserData;}
        virtual void* GetCurlData( void ){ return m_userData; }
    private:
        void* m_userData;
    };
然后让一个类实现这个接口,如下所示:

    class ICurlUserData
    {
    public:
        virtual void SetCurlData( void* pUserData ) = 0;
        virtual void* GetCurlData( void ) = 0;
    };
    class CurlUserData
    {
    public:
        CurlUserData() : m_userData(nullptr){};
        virtual ~CurlUserData(){};

        virtual void SetCurlData( void* pUserData ){ m_userData = pUserData;}
        virtual void* GetCurlData( void ){ return m_userData; }
    private:
        void* m_userData;
    };
这样通过:

void SomeFunction( const std::string& url, const std::string& username, const std::string& password, ICurlUserData* userData)
{
    CurlUserData data = static_cast<CurlUserData*>(userData);
    void* myData = data->GetCurlData();
    int myNumber = static_cast<int>(myData); 
    //blah blah
}
void SomeFunction(const std::string&url,const std::string&username,const std::string&password,ICurlUserData*userData)
{
CurlUserData=静态_转换(userData);
void*myData=data->GetCurlData();
int myNumber=静态转换(myData);
//废话
}

感谢您的帮助

void*
数据传递给调用您的
curl
(或任何其他)C函数的正确方法如下:

StronglyTyped myobj;

extern "C" void myfunc (void* arg)
{
   StronglyTyped* p_myobj = static_cast<StronglyTyped*>(arg);
   // do something
}


//.. somewhere in your code ...
curl_something(curlarg1, curlarg2, myfunc, static_cast<void*>(&myobj));
传递给函数的两个实际参数必须完全具有签名中指定的类型,因此一个必须编写具有此签名的函数:

 void somefunction (void*);
而且必须有
void*
指针才能传递给它。后者通常通过强制转换从常规对象指针获得
somefunction
通常在第一行恢复强类型对象指针

不需要任何其他的
void*
指针,也不需要任何由“curl”函数指定的指针

确实,如果冒犯函数用C++编写,那么它很容易成为函数模板:

template <typename T>
void void cxx_function_with_a_callback (..., ...,
                                       void (*user_function)(T*),
                                       T* user_data);
模板
void cxx_函数_与_a_回调(。。。,
void(*用户函数)(T*),
T*用户数据);
在这个版本中,没有
void*
,但它与C版本基本相同。具有带回调的
c\u函数的系统与具有带回调的
cxx\u函数的系统之间的唯一区别是:

  • 用户功能的类型
  • 用户数据的类型
  • 存在或不存在从和到
    void*

  • 如果一个带有
    cxx\u函数\u和void*
    ,那么一个带有
    c\u函数\u和void*
    指针。如果由于某种原因,带有
    cxx\u函数的系统需要
    void*
    ,那么带有
    c\u函数的系统也需要在类似的地方使用
    void*
    ,但是这些
    void*
    的事情与
    c_function_和_a_callback
    如何存储用户数据无关。

    好吧,你在这个问题上有一个很好的答案!我想另一种选择可能是使
    模板void SomeFunction(const string&url,const string&username,const string&password,T&userData)
    为什么不像您最初显示的那样传递userData呢?为什么要千方百计地强迫它呢?让调用方传递它想要的任何数据,以<代码>某个函数()/代码>,它在C++中工作得很好。仅仅因为C++支持/强调结构化数据并不意味着你必须使用它来做任何事情。例如,如果调用方希望传递一个简单的
    int*
    指针,该怎么办?像你展示的那样包装太过分了。谢谢你。但是我传递数据的函数是C++函数,而不是直的C.代码> MyFunc < /Cord>是C++函数。一个C函数将不能执行<代码> STATICE-CASTE> /COD>。是的,但是您的C++函数仍然使用空隙*作为参数。如果可能的话,我想摆脱它。你不能。curl函数需要一个
    void(*)(void*)
    ,即具有
    void*
    参数的函数。这正是你应该传递给它的。您的尝试大约出现了6次
    void*
    ,但似乎都没有任何作用。在C或其他遗留接口需要使用
    void*
    的地方,应该使用
    void*
    。您的代码不会尝试调用旧接口。而不是在C++中解决如何通过 Value*/Cuff>的全局问题,这是没有意义的,请写下你打算调用的<代码> CURL</代码>函数的签名,然后问“我怎么称呼这个家伙,然后把我的数据拿回来?”