在C+中以void*形式传递数据+; 我在C++程序中使用卷曲。Curl可以存储传递给它的“用户数据”,这样当我收到curlhttp回调时,我就可以再次检索这个用户数据
Curl将以void*的形式存储此数据。我希望能够将数据传递给如下函数:在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++方法是如何将数据作为一个空洞传递的? 我是否应该
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</代码>函数的签名,然后问“我怎么称呼这个家伙,然后把我的数据拿回来?”