从模板参数类型为新对象分配内存

Allocate memory for a new object from template argument type

我希望能够创建 T 类型的新对象,如此代码段所示。

template<typename T, typename Arg1, typename Arg2>
void ManageDevice(T& device, Arg1 arg1, Arg2 arg2)
{
    auto newDevice = new T{ arg1, arg2 };
    // ... Perform more operations on newDevice
}

我目前正在使用这样的功能:

CertainClass* device;
ManageDevice(device, arg1, arg2);

编译器returns错误:无法从"initializer list"转换为"class of T*"。

我也试过:

auto newDevice = new decltype(device){ arg1, arg2 };

并出现以下错误:

错误 C2464 'class of T*&': 无法使用 'new' 分配引用

所以我用这个删除了引用:

using DeviceType = std::remove_reference<decltype(device)>::type;
auto newDevice = new DeviceType{ arg1, arg2 };

我又收到了第一条错误信息。

问题:

  1. 知道这是否合法吗?我该怎么做才能让它发挥作用?
  2. 在理想情况下,我希望通过直接传递指向 class 的指针而不是此 class 的实例来调用该函数,这可能吗?
  3. 这个叫什么名字?

它应该是 ManageDevice(*device, arg1, arg2); 所以 T 被推导为 CertainClass 所以构造函数调用 new T{ 将是合式的。或者,如果您要传递一个指针(这可能不是一个好主意),请使用 std::remove_pointerT:

获取对象类型
using DeviceType = typename ::std::remove_pointer<T>::type;

您的事实参数和模板参数不匹配。当模板写成

template<typename T>
void foo(T& t);

并用

跟注
D* d;
foo(d);

模板中 T 的类型将为 D*。现在,如果您尝试

x = new D*{'a', 'b', 'c'};

你会得到一个明显的编译错误,因为没有接受这些参数的指针的(伪)构造函数。

为了实现你的目标,你应该使用

template<typename T, typename Arg1, typename Arg2>
void ManageDevice(T*& device, Arg1 arg1, Arg2 arg2)...

在这种情况下,当使用

调用时
Device* device;
ManageDevice(device...);

模板中的实际 T 将被推断为 Device

这是在假设您使用 device 作为输出参数的情况下编写的。如果我猜对了,更好的选择是实际 return 值,而不是使用输出参数:

template<typename T, typename Arg1, typename Arg2>
T* ManageDevice(Arg1 arg1, Arg2 arg2) {
   ...
   return new_device;
}

那么,你可以称它为

auto* device = ManageDevice<Device>(a, b);

并在其上将 T* 替换为 unique_ptr<T>,将 new 替换为 std::make_unique