练习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;
}