c++ - 将 boost::shared_array<void> 转换为 boost::shared_array<int>

标签 c++ boost casting smart-pointers

我有一些遗留代码,如下所示:

void* getData(DataType  dataType)
{

    switch(dataType)
    {
    case TYPE_FLOAT:
        return new float[ rows * clms ];

    case TYPE_INT:
        return new int[ rows * clms ];

    case TYPE_DOUBLE:
        return new double[ rows * clms ];
    default:
        return NULL;
    }
}

我希望能够做到这一点:

boost::shared_array < void > getData(DataType   dataType)
{

    boost::shared_array < void > theData;

    switch(dataType)
    {
    case TYPE_FLOAT:
        theData = boost::shared_array<float>(new float[ rows * clms ]);
                    break;

    case TYPE_INT:
        theData = boost::shared_array<int>(new int[ rows * clms ]);
                    break;

    case TYPE_DOUBLE:
        theData = boost::shared_array<double>(new double[ rows * clms ]);
                    break;

    default:
        break;
    }

            return theData;
}

但我无法正确选择类型转换。我需要做什么才能使此声明生效?

最佳答案

你不能只是转换,因为shared_array<void>不知道如何删除 void*指向 int 数组的指针.

你可以尝试像 shared_array<void>(new int[rows*clmns], checked_array_deleter<int>()) 这样的东西,虽然我没有测试过它是否正确。您可能需要将删除器包装在将参数转换为 int* 的东西中.

或者,由于您所有的类型都是 POD,因此您可以使用 char 的数组和一个 shared_array<char> .则无需指定删除器。

顺便说一句,在这里插入通常提示这是一个狡猾的设计。如果你指的是 void* 的东西, 或 void 智能指针,那么你忽略 C++ 是一种静态类型语言是有原因的。您可能会查看 Boost.Variant,具体取决于数组的使用方式。

关于c++ - 将 boost::shared_array<void> 转换为 boost::shared_array<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5233568/

相关文章:

java - Java 中的泛型类型转换与参数化类型转换

c++ - C++ 构造函数的异常说明符

c++ - SFINAE:它如何与派生类一起工作?

c++ - 如何减少 C++ map/unordered_map 容器中查找的分配?

c++ - 将成员函数添加到 Boost.Variant

c++ - 将 const char * const 参数的成员分配给新值

c++ - Cocos2d-x 缺少 sys/socket.h

c++ - 将引用返回值分配给非引用变量

c++ - Boost图库分布式广度优​​先搜索MPI_Unpack运行时报错

java - 动态(运行时)多态性在java中如何工作?换句话说,JVM 如何知道要调用哪些方法?