我使用堆内存作为一个小示例的一部分,最后我写了这个:
double* p = new double[4] { 0.0, 1.0, 2.0, 3.0 };
...
delete[] p;
后来我想把它升级为
std::unique_ptr
:
std::unique_ptr<double[]> arrp(new double[4] { 0.0, 1.0, 2.0, 3.0 });
...
(不需要
delete[]
)。
当然,使用
std::make_unique
总是比 new 更好,但是 如何使用 std::make_unique
初始化元素数组?
为了回答我自己的问题,这是一个糟糕的、不好的、低效的实现,我不一定想使用。
最多可以澄清我在问题中想要的内容。
#include <memory>
#include <utility>
#include <type_traits>
namespace xtd {
template<class T, class T2>
auto make_unique(std::initializer_list<T2> il) {
if constexpr(std::is_array_v<T>) {
std::unique_ptr<T> ret(new std::remove_extent_t<T>[il.size()]);
std::uninitialized_copy(il.begin(), il.end(), ret.get());
return ret;
} else {
return std::make_unique<T>(il);
}
}
}
int main() {
std::unique_ptr<double[]> p(new double[4] { 0.0, 1.0, 2.0, 3.0 });
auto q = xtd::make_unique<double[]>({0.0, 1.0, 2.0, 3.0});
}