在STL容器中放置智能指针

Placing smart pointers in an STL container

本文关键字:智能 指针 STL      更新时间:2023-10-16

我有一个容器,我想用指针来填充类c。然而,我宁愿使用Boost shared_ptr而不是哑指针。

我将容器声明为container<C*>,但随后得到这个错误:

  no known conversion for argument 1 from ‘boost::shared_ptr<C>’ to ‘C* const&’

我应该如何声明使用boost共享文件的容器?如果可能的话,我希望它也接受哑指针。


UPDATE:从响应来看,似乎容器确实必须声明为接受智能指针,不能同时接受智能指针和非智能指针。也就是说,不存在从聪明到愚蠢或反之的强制。对吗?

下面是一个使用c++ 11共享指针的简单工作演示。它们类似于Boost的共享指针。

#include <iostream>
#include <memory>
#include <vector>
int main( int argc, char* argv[] )
{
    // Create vector
    std::vector<std::shared_ptr<int>> buffer;
    for( int i=0; i<10; i++ )
        buffer.push_back(std::make_shared<int>(i));
    for( int i=0; i<10; i++ )
        if( (*buffer[i]) != i ){
            std::cout << "Match invalid for " << i << "." << std::endl;
            return 1;
        }
    std::cout << "Valid result" << std::endl;
    return 0;
}
我用 编译了这个
g++ main.cpp -o main -std=c++11

为了使用向量,你需要显式指定它们将保存的对象类型。在你的例子中是boost::shared_ptr。我还理解您想要在该容器中存储哑指针。你可能指的是原始指针。如前所述,您的容器可以主要存储一种类型,但也有例外,例如,类型通过继承或其他机制(如序列化)相关,当您试图使用这些对象或类型是泛型类型时,需要一些显式的向下转换。从来没有减少过。这里有另一种方法。您不需要同时存储智能指针和原始指针的向量,因为您总是可以从智能指针获得原始/哑指针。最好的方法是创建一个像这样的向量

std::vector<boost::shared_ptr<foo>> vec;

上面的操作创建了一个vector,用于存储指向foo的共享指针。

那么当你有一个这样的共享指针

 boost::shared_ptr<foo> foo_ptr(new foo());

你可以这样做

vec.push_back(foo_ptr)

当你需要哑指针时,你可以这样做

foo* f = vec[0].get();

我读了你的更新,你说

…看来这个集装箱确实必须申报携带智能物品指针,它既不能接受智能指针也不能接受愚蠢指针。

你应该明白boost::shared_ptr<Type>是一个智能指针