我有一个大型图书馆的功能。我必须将论证作为void *传递。我想传递一个矢量。我正在使用
传递它vector<myClass*> myName;
function(...,(void*)&myName,...)
现在在这个函数中我想将void *转换回vector但我不知道该怎么做。
我正在尝试这样的事情:
vector<myClass*> myName = static_cast< vector<myClass*> >(voidPointerName);
但我得到
error: invalid conversion from ‘void*’ to ‘long unsigned int’
error: initializing argument 1 of ‘std::vector<_Tp, _Alloc>
::vector(size_t, const _Tp&, const _Alloc&)
[with _Tp = myClass*, _Alloc = std::allocator<myClass*>]’
编辑:
我想要做的是将一个指向我自己的类的指针传递给这个函数http://ftp.heanet.ie/disk1/www.gnu.org/software/libmicrohttpd/microhttpd/microhttpd_10.html,所以我必须将它转换为void *然后将它转换回vector,所以代码如下: / p>
vector<myClass*> v
MHD_create_response_from_callback (...,HERE_PASS_VECTOR,...);
和此函数的代码:
callback(void* cls,...)
{
CAST_CLS_BACK_TO_VECTOR
ITERATE_OVER_VECTOR
}
答案 0 :(得分:3)
我猜你实际上在做像
这样的事情vector<myClass*> msisdnStructs;
...
function(...,(void*)&msisdnStructs,...);
在这种情况下,您将指针传递给向量。在函数中,您尝试将指针转换为向量,这当然不起作用。但是,您可以取消引用传递的void*
参数(适当地转换),并使用它来分配对向量的引用(使用引用以避免复制):
vector<myClass*>& myName = *reinterpret_cast<vector<myClass*>*>(voidPointerName);
答案 1 :(得分:2)
你的这段代码没有编译:
vector<MyClass*> myName = static_cast< vector<myClass*> >(voidPointerName);
尝试逐步推理 。
您有一个void*
作为输入(voidPointerName
),并且您希望返回std::vector
。
您要做的第一件事就是从void*
投射到vector*
:您可以使用现代C ++风格的投射reinterpret_cast
来达到此目的:
<<vector pointer>> p = reinterpret_cast< <<vector pointer>> >(voidPointerName);
由于您有vector<MyClass*>
,<<vector pointer>>
实际上是vector<MyClass*> *
(我刚刚为指针添加了*
。)
因此,上面的伪代码变为:
vector<MyClass*>* p = reinterpret_cast<vector<MyClass*> *>(voidPointerName);
您可能希望使用C ++ 引用 &
(它提供带有指针语义的值语法),因此您的代码可以稍微修改为:
vector<MyClass*>& v = *( << the reinterpret_cast thing above >> );
(在上述作业的右侧,我们使用*
取消引用指针。)
即
// Final form
vector<MyClass*>& v = *reinterpret_cast<vector<MyClass*> *>(voidPointerName);
答案 2 :(得分:0)
int a1=1, a2=2,a3=3,a4=4;
std::vector<int> tst;
tst.push_back(a1);
tst.push_back(a2);
tst.push_back(a3);
tst.push_back(a4);
for (std::vector<int>::iterator it = tst.begin() ; it != tst.end(); ++it)
{
std::cout << ' ' << *it;
//ptst.push_back(const_cast<void*>(it));
}
std::cout << '\n';
//const void *pitst; --WORKING
//pitst=const_cast<void *>(reinterpret_cast<void *>(&a1)); --WORKING
//std::cout<<"\n"<<*reinterpret_cast<const int *>(pitst); --WORKING
std::vector<const void *> ptst;
ptst.push_back(const_cast<void *>(reinterpret_cast<void *>(&a1)));
ptst.push_back(const_cast<void *>(reinterpret_cast<void *>(&a2)));
ptst.push_back(const_cast<void *>(reinterpret_cast<void *>(&a3)));
ptst.push_back(const_cast<void *>(reinterpret_cast<void *>(&a4)));
std::cout<<"\n"<< *reinterpret_cast<const int *>(ptst[0]);
//std::cout<<"\n"<< *reinterpret_cast<const int *>(ptst.pop_back()); --compiler error
for (std::vector<const void *>::iterator it = ptst.begin() ; it != ptst.end(); ++it)
{
std::cout<<"\n"<< *reinterpret_cast<const int *>(*it);
//ptst.push_back(const_cast<void*>(it));
}
...........
输出:
1 2 3 4
1 1个 2 3 4 ..........
您可以将..int替换为您的..class并尝试