第十六章 16.4.3节练习

练习16.58

为你的StrVec类及你为16.1.2节(第591页)练习中编写的Vec类添加emplace_back函数。

解答:

这个参考623页的StrVec中的emplace_back实现即可。


练习16.59

假定s是一个string,解释调用svec.emplace_back(s)会发生什么。

解答:

在construct调用中的模式会扩展除std::forward<string>(s).


练习16.60

解释make_shared(参见12.1.1节,第401页)是如何工作的。

解答:

【引用】此函数再动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。类似顺序容器的emplace成员,make_shared用其参数来构造给定类型的对象。


练习16.61

定义你自己版本的make_shared.

解答:

#include <iostream>
#include <memory>
#include <utility>
#include <string>

#define Debug 1

namespace test{
  template <typename T, typename... Args>
  std::shared_ptr<T> make_shared(Args&&... args){
    std::shared_ptr<T> ptr(new T(std::forward<Args>(args)...));
#if Debug
    std::cout << "use test make_shared" << std::endl;
#endif
    return ptr;
  }
}

int main(){
  std::shared_ptr<int> p1 = test::make_shared<int>(42);
  std::shared_ptr<std::string> p2 = test::make_shared<std::string>("hello");
  std::shared_ptr<std::string> p3 = test::make_shared<std::string>(10, 'o');
  std::cout << *p1 << std::endl;
  std::cout << *p2 << std::endl;
  std::cout << *p3 << std::endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值