美文网首页
C++11 实现make_unique

C++11 实现make_unique

作者: FredricZhu | 来源:发表于2020-12-25 12:20 被阅读0次

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

相关文章

网友评论

      本文标题:C++11 实现make_unique

      本文链接:https://www.haomeiwen.com/subject/zabbnktx.html