1

我正在使用std::shared_ptr<T>很多不同的类型。由于我想将所有这些不同shared_ptr的 s 存储在一个向量中,因此我认为必要时可以使用std::vector<std::shared_ptr<void> >and 来回转换。void

我熟悉以下“裸指针”用法

#include <iostream>

void print(void* void_ptr)
{
    int* int_ptr = static_cast<int*>(void_ptr);
    std::cerr << *int_ptr << std::endl;
}

int main()
{
    int* int_ptr = new int(4);
    void* void_ptr = static_cast<void*>(int_ptr);
    print(void_ptr);
    delete int_ptr;
}

如果您有裸指针,这可以完美地工作g++并且afaik这是执行此操作的正确方法。但现在我想和std::shared_ptrs 一样。

#include <iostream>
#include <memory>

void print(std::shared_ptr<void> void_ptr)
{
    std::shared_ptr<int> int_ptr = ??(void_ptr); // simple cast won't work
    std::cerr << *int_ptr << std::endl;
}

int main()
{
    std::shared_ptr<int> int_ptr = std::make_shared<int>(4);
    std::shared_ptr<void> void_ptr = ??(int_ptr); // same problem here
    print(void_ptr);
}

这甚至可能吗?我有很多不同的类型shared_ptr,但这些类型几乎没有共同点。他们不共享基类或类似的东西(如果这是唯一的方法,我会这样做,但使用某种shared_ptr<void>.

4

1 回答 1

1

std::static_pointer_cast执行此功能。然而,这通常是一个非常糟糕的主意——为什么不boost::any或者boost::variant什么?这种弱类型和弱强制执行的代码只会让你一头雾水。

于 2012-09-15T21:23:49.983 回答