具有任何返回类型的函数模板参数

时间:2015-02-02 01:23:59

标签: c++ c++11

我有以下模板化的deletor类,我使用unique_ptr来删除C类型。

template<typename T, void (*DeletorFunc)(T*)>
struct CTypeDeletor
{
  void operator()(T* ptr)
  {
    DeletorFunc(ptr);
  }
};

int main(void)
{
  typedef unique_ptr<CType, CTypeDeletor<CType, CType_free>> CTypePtr;
  CTypePtr ctype(CType_new());
  // ctype will be deleted when we return from main
}

嗯,只要CType_free的返回类型为&#39; void&#39;就行。但是如果dfree函数的返回类型不是&#39; void&#39;然后我无法使用CTypeDeletor。

有没有办法让CTypeDeletor更通用,以便我可以使用任何返回类型的自由函数?

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式使现有解决方案更具通用性:

template<typename T, typename RetType, RetType (*DeletorFunc)(T*)>
struct CTypeDeletor
{
  RetType operator()(T* ptr)
  {
    return DeletorFunc(ptr);
  }
};

然而,由于你可以简单地进行

,这是不必要的错综复杂的
int main(void)
{
  typedef unique_ptr<CType, decltype(&CType_free)> CTypePtr;
  CTypePtr ctype(CType_new(), &CType_free);
}

来自cppreference

  

Deleter必须是对函数的FunctionObject或lvalue引用的FunctionObject或lvalue引用,可以使用unique_ptr :: pointer类型的参数调用。