【问题标题】:Allocate memory for a new object from template argument type从模板参数类型为新对象分配内存
【发布时间】:2018-07-20 16:52:01
【问题描述】:

我希望能够创建一个 T 类型的新对象,如这段代码 sn-p 所示。

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);

编译器返回错误:Cannot convert from "initializer list" to "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. 在理想情况下,我希望通过直接传递指向类的指针而不是此类的实例来调用函数,这可能吗?
  3. 这叫什么名字?

【问题讨论】:

标签: c++ class templates memory new-operator


【解决方案1】:

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

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 作为输出参数的情况下编写的。如果我猜对了,更好的选择是实际返回值,而不是使用输出参数:

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&lt;T&gt;,将 new 替换为 std::make_unique

【讨论】:

  • 本想返回新初始化设备的值,但我想调用这个函数来创建许多不同类的设备。使用这种方法我不明白模板将如何调用每个不同 T 的良好构造函数。(我刚开始使用模板)
  • @JuBonn 很好,我没有具体说明。让我也把它放在答案中。
  • 由于旧的代码依赖关系,我不能使用智能指针...但是您提出的语法 (T*&) 似乎对我有用!谢谢。
【解决方案2】:

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

using DeviceType = typename ::std::remove_pointer<T>::type;

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 2019-11-27
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2021-08-05
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多