【问题标题】:Get point-to type of boost shared_ptr获取指向类型的 boost shared_ptr
【发布时间】:2013-08-09 11:11:05
【问题描述】:

在我的项目中,我使用 boost::shared_ptr,在一个头文件中,我写道:

typedef boost::shared_ptr<boost::lockfree::spsc_queue<PacketsInput, boost::lockfree::capacity<4096> > > queue_ptr;

在另一个源文件中,我使用它:

std::vector<queue_ptr> v;
for (...)
    v.push_back(boost::make_shared(/* #1 */));

在 #1 中,我想写 queue_ptr 的指向类型,而不是

boost::lockfree::spsc_queue<PacketsInput, boost::lockfree::capacity<4096> >

还有多久!

但是boost::shared_ptr里面没有typedef,我找到的只有一个typedef:typedef typename boost::detail::sp_element&lt; T &gt;::type element_type;但是不知道怎么用。

有什么帮助吗?坦克很多!

【问题讨论】:

  • 如果你使用 C++11,那么你应该迁移到 std::shared_ptr
  • @Bathsheba 是的,但是我的编译器有点老了,不是所有的 c++11 功能都支持,我不想混合 std 和 boost 组件;-)
  • "但是 boost::shared_ptr 中没有 typedef,我发现的唯一一个是 typedef" 所以有一个,这正是你要找的为!

标签: c++ boost shared-ptr smart-pointers


【解决方案1】:

Documentation 表示有一个名为 element_type 的成员 typedef:

这个示例程序运行良好(断言通过):

#include <boost/shared_ptr.hpp>
#include <boost/type_traits.hpp>
#include <cassert>

int main()
{
    bool b =  boost::is_same<boost::shared_ptr<int>::element_type, int>::value;
    assert(b);
}

鉴于您已经声明了 typedef,您可以像这样使用它:

typedef queue_ptr::element_type elem_type;
v.push_back( boost::make_shared<elem_type>( /* args for ctor */ ) );

【讨论】:

  • 谢谢,你的建议是对的,帮助很大,但是使用两次 make_shard 没有编译,也许使用这个 v.push_back(boost::make_shared()); ;-)
【解决方案2】:

你可以使用两种类型定义

   typedef boost::lockfree::spsc_queue<PacketsInput, boost::lockfree::capacity<4096> > my_queue;
   typedef boost::shared_ptr<my_queue> my_queue_ptr;

然后您可以在make_shared 中使用my_queue

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多