void * to vector

时间:2014-04-02 13:41:11

标签: c++ vector void-pointers

我有一个大型图书馆的功能。我必须将论证作为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
    }

3 个答案:

答案 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并尝试