#include <iostream>
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <initializer_list>
#include <iterator>
#include <memory>
#include <type_traits>
#include <utility>
#include <typeinfo>
template <typename T>
struct MakeUniqueResult {
using scalar = std::unique_ptr<T>;
};
template <typename T>
struct MakeUniqueResult<T[]>
{
using array = std::unique_ptr<T[]>;
};
template <typename T, size_t N>
struct MakeUniqueResult<T[N]> {
using invalid = void;
};
int main()
{
MakeUniqueResult<int>::scalar int_type(new int);
std::cout << typeid(int_type).name() << std::endl;
MakeUniqueResult<int[]>::array int_array_type(new int[5]);
std::cout << typeid(int_array_type).name() << std::endl;
//MakeUniqueResult<int[6]>::invalid void_type;
//std::cout << typeid(void_type).name() << std::endl;
return 0;
}
编译:
:g++ -std=c++11 main.cc -o main
运行:
:./main
NSt3__110unique_ptrIiNS_14default_deleteIiEEEE
NSt3__110unique_ptrIA_iNS_14default_deleteIS1_EEEE
还原:
:./main | c++filt
std::__1::unique_ptr<int, std::__1::default_delete<int> >
std::__1::unique_ptr<int [], std::__1::default_delete<int []> >