使用 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 删除器?
注意我知道我可以进行模板专业化,但这实际上是在复制结构。