【发布时间】:2019-05-14 17:32:38
【问题描述】:
我有一个函数可以创建一个基础类型为P 的新对象。这里P 是一个可解引用的类型,如指针或智能指针。
template<typename P>
auto make_new()
例如,对于指针和智能指针,
struct A
{
int a = 3;
};
A* a = make_new<A*>();
std::cout << a->a << std::endl;
delete a;
std::shared_ptr<A> b = make_new<std::shared_ptr<A>>();
std::cout << b->a << std::endl;
现在,对于共享指针,我将实现make_new,如下所示,
template<typename P>
auto make_new()
{
using Ptype = typename P::element_type;
return P(new Ptype);
}
这不适用于指针。
现在,指针和智能指针都适用,
template<typename P>
auto make_new()
{
using Ptype = typename std::remove_reference<decltype(*P())>::type;
return P(new Ptype);
}
但不适用于std::optional。
是否有获取可取消引用对象的基础类型的规范方法?
我知道 * 和 -> 可以重载到任何东西,并且不能保证构造函数像上面那样工作,或者这样做是有意义的。
只是想知道是否有办法,而不仅仅是找到它,或者只是做一些愚蠢的事情。
【问题讨论】:
-
无关:如果这不是出于教育目的,consider using
std::make_shared和朋友。如果这是出于教育目的,您可以通过查看std::make_shared的实现方式来找到一些巧妙的技巧。 -
您可以使用
std::declval<P>()代替P()中的decltype。它适用于非默认可构造类型。 -
也许通过专业化?虽然你为什么不使用类似于
std::make_shared或std::make_unique的东西并且not 使用指针类型作为模板参数?我也很好奇你试图解决的潜在问题?为什么需要这个make_new函数?为什么需要将模板参数设为可取消引用的类型? -
你试过
std::remove_pointer吗? -
@Someprogrammerdude
std::remove_pointer不会对shared_ptr做任何事情。