功能中的模板模板替换

Ond*_*tík 2 c++ templates

我正在实现自己的UniquePtr,我想测试它具有相同的界面std::unique_ptr.所以我写了一个函数:

class A
{
  A() { }
  ~A() { }
};

class B
{
  B() { }
  ~B() { }
};


template <template <typename Type> class UPtr>
void test_unique_ptr_interface()
{
  UPtr<A> p1(new A);
  {
    UPtr<A> p2(std::move(p1));
    p1 = std::move(p2);
  }

  UPtr<B> p1(new B);
  {
    UPtr<B> p2(std::move(p1));
    p1 = std::move(p2);
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后我想这样称呼它:

test_unique_ptr_interface<std::unique_ptr>(); 
test_unique_ptr_interface<UniquePtr>();
Run Code Online (Sandbox Code Playgroud)

第一次调用测试std::unique_ptr通过测试,因此我正在测试正确的接口.第二个调用测试我自己的UniquePtr实现作为替代品.这个功能test_unique_ptr_interface会长很多,我刚发布了一个简单的例子.

但是,我收到一个错误:

error: no matching function for call to ‘test_unique_ptr_interface()’
   test_unique_ptr_interface<std::unique_ptr>();
Run Code Online (Sandbox Code Playgroud)

我应该如何声明该test_unique_ptr_interface()函数以便编译?

Rei*_*ica 5

查看以下声明std::unique_ptr:

template <class T, class Deleter = std::default_delete<T>>
class unique_ptr;
Run Code Online (Sandbox Code Playgroud)

它是一个包含2个模板参数的类模板.要完全复制它,您必须更改您的类模板以匹配,并更改测试功能:

template <template <typename, typename> class UPtr>
void test_unique_ptr_interface()
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是将模板模板参数变为可变参数:

template <template <typename... > class UPtr>
void test_unique_ptr_interface()
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这将允许您的类只保留一个模板参数.但请注意,它不会是完全替代品std::unique_ptr.