【发布时间】:2014-11-09 17:56:53
【问题描述】:
我在我的 c++ 程序中使用 curl。 Curl 可以存储传递给它的“用户数据”,这样当我收到 curl HTTP 回调时,我可以再次检索此用户数据。
Curl 会将此数据存储为 void*。我希望能够将数据传递给这样的函数:
void SomeFunction( const std::string& url, const std::string& username, const std::string& password, void* userData)
{
//Pass userData to curl..blah blah
}
我的问题是将数据作为 void* 传递的正确和正确的 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;
};
然后像这样传递:
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
}
感谢您的帮助
【问题讨论】:
-
嗯,你的问题有一个很好的答案!我想另一种选择可能是制作一个
template <type T> void SomeFunction( const string& url, const string& username, const string& password, T& userData) -
为什么不像你最初展示的那样直接将 userData 作为
void*传递?为什么要费尽心思去强制它呢?让调用者将它想要的任何数据传递给SomeFunction(),它在 C++ 中工作得很好。仅仅因为 C++ 支持/强调结构化数据并不意味着您必须将它用于所有事情。例如,如果调用者想要传递一个简单的int*指针怎么办?像你展示的那样包装它是多余的。