【发布时间】:2013-04-22 10:32:56
【问题描述】:
使用 Visual Studio 2010,我有:
using namespace std;
struct C
{
unique_ptr<F1, default_delete<F1>> Field1;
unique_ptr<F2, default_delete<F1>> Field2;
unique_ptr<FN, default_delete<F1>> FieldN;
}
它将在两个上下文中使用,CPU 和 GPU,在 CPU 上下文中,结构和字段将具有 default_delete 和在 GPU 上下文中,使用 CUDA,它们将具有自定义删除器它使用函数 cudaFree 删除。
可能使用的自定义删除器看起来像这样
struct DevDeleter
{
void operator()(void* d_ptr)
{
cudaError_t error = cudaFree(d_ptr);
if (error != cudaSuccess)
{
throw;
}
}
}
所以,我的第一个预感是看模板,我的结构变成了:
template<typename Deleter>
struct C
{
unique_ptr<F1, Deleter> Field1;
unique_ptr<F2, Deleter> Field2;
unique_ptr<FN, Deleter> FieldN;
}
我有一个需要在 2 个删除上下文中工作的结构框架(超过 30 个)。如果我想在某个函数中声明struct C,这会有递归声明,不能写:
unique_ptr<C<default_delete<C<default_delete<C<(recursive)>>>>, default_delete<C(recursive)>> c(new C<...>());
您是否有改进或干净的解决方案来允许结构为其成员拥有自定义的 unique_ptr 删除器?
注意我知道我可以进行模板专业化,但这实际上是在复制结构。
【问题讨论】:
-
为什么会有递归声明?这种方法在原则上看起来很合理。
-
因为default_delete需要一个模板,这个模板是类名,但是类名有一个模板,而这个模板有default_delete等等...
-
我不明白。你可以说
C<std::default_deleter<F>>,也可以说C<DevDeleter>。没有什么递归的吗?! -
在我的客户端代码中,我需要提供 T 和 T 在我的情况下将是 default_delete
(再次)等等 :):):)。 -
你能举一个最小的完整例子吗?
标签: c++ visual-studio-2010 templates cuda unique-ptr