C++ 11标准库中默认实现了make_shared,但是没有给出一个make_unique的实现。
本例实现make_unique。
技术要点:
1.使用模板函数重载,分别支持普通指针,变长数组,不支持定长数组
2.std::enable_if关键字根据不同条件,调用不同模板
3.std::unique_ptr能构造和析构数组
make_unique.hpp
#ifndef _MAKE_UNIQUE_HPP_
#define _MAKE_UNIQUE_HPP_
#include <type_traits>
#include <memory>
// 单一元素类模板定义
template <typename T>
using Ele = typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T> >::type;
// 变长数组类模板定义
template <typename T>
using Slice = typename std::enable_if<std::is_array<T>::value && std::extent<T>::value == 0, std::unique_ptr<T>>::type;
// 定长数组类模板定义
template <typename T>
using Arr = typename std::enable_if<std::extent<T>::value != 0, void>::type;
// 支持普通指针
template <typename T, typename ... Args> inline
Ele<T> make_unique(Args && ... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
// 支持动态数组
template <typename T> inline
Slice<T> make_unique(size_t size) {
using U = typename std::remove_extent<T>::type;
return std::unique_ptr<T>(new U[size]);
}
// 过滤定长数组
template <typename T, typename ... Args>
Arr<T> make_unique(Args &&...) = delete;
#endif
main.cpp
#include "make_unique.hpp"
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
int main(void) {
auto u1 = make_unique<int>(10);
cout << *u1 << endl;
auto u2 = make_unique<int[]>(10);
for(int i=0; i<10; i++) {
u2[i] = i;
}
for(int i=0; i<10; i++) {
cout << u2[i] << " ";
}
cout << endl;
cout << "请按任意键继续..." << endl;
getchar();
return 0;
}
Makefile
TAR=main
WORKSPACE_DIR=.
CC:=g++
.PHONY: build clear all
build:
$(CC) -std=c++11 $(WORKSPACE_DIR)/*.*pp -g -o $(TAR)
all: clear build
clear:
rm -rf $(TAR)
程序输出如下
图片.png
网友评论