从模板参数类型为新对象分配内存
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 };
我又收到了第一条错误信息。
问题:
- 知道这是否合法吗?我该怎么做才能让它发挥作用?
- 在理想情况下,我希望通过直接传递指向 class 的指针而不是此 class 的实例来调用该函数,这可能吗?
- 这个叫什么名字?
它应该是 ManageDevice(*device, arg1, arg2);
所以 T
被推导为 CertainClass
所以构造函数调用 new T{
将是合式的。或者,如果您要传递一个指针(这可能不是一个好主意),请使用 std::remove_pointer
从 T
:
获取对象类型
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
。
我希望能够创建 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 };
我又收到了第一条错误信息。
问题:
- 知道这是否合法吗?我该怎么做才能让它发挥作用?
- 在理想情况下,我希望通过直接传递指向 class 的指针而不是此 class 的实例来调用该函数,这可能吗?
- 这个叫什么名字?
它应该是 ManageDevice(*device, arg1, arg2);
所以 T
被推导为 CertainClass
所以构造函数调用 new T{
将是合式的。或者,如果您要传递一个指针(这可能不是一个好主意),请使用 std::remove_pointer
从 T
:
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
。