空*到向量

void* to vector

本文关键字:向量      更新时间:2023-10-16

我有一个来自某个大库的函数。我必须将论点作为无效*传递。我想传递一个向量。我正在使用传递它

vector<myClass*> myName;
function(...,(void*)&myName,...)

现在在这个函数中,我想将 void* 投射回矢量,但我不知道该怎么做。

我正在尝试类似的东西:

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,因此代码如下所示:

    vector<myClass*> v
    MHD_create_response_from_callback (...,HERE_PASS_VECTOR,...);

以及此函数的代码:

    callback(void* cls,...)
    {
      CAST_CLS_BACK_TO_VECTOR
      ITERATE_OVER_VECTOR
    }

我猜你实际上是在做类似的事情

vector<myClass*> msisdnStructs;
...
function(...,(void*)&msisdnStructs,...);

在这种情况下,您将传递指向矢量的指针。在函数中,您尝试将该指针到向量转换为向量,这当然不起作用。但是,您可以取消引用传递的void*参数(适当强制转换),并使用它来分配给对向量的引用(使用引用以避免复制):

vector<myClass*>& myName = *reinterpret_cast<vector<myClass*>*>(voidPointerName);

你的这段代码无法编译:

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

11234..........

您可以替换..int 与您的 ..类并尝试