如何使用模板化构造函数定义推导指南?

How to define deduction guide with templated constructor?

为了简化我的问题,我将使用std::unique_lock作为工具来解释。 std::unique_lock 有一个模板参数,互斥锁。然而,它的构造函数也是一个模板函数 unique_lock(TMutex &, const chrono::duration<_Rep, _Period>&).

用这个的时候可以这样写:

 auto lock = std::unique_lock(my_mutex, 5s);

所以,问题是:如何为此写出推导指南(不改变行为),怎么做?

迄今为止我最好的尝试:

template<typename _Mutex>
template<typename _Rep, typename _Period>
unique_lock(_Mutex &, const chrono::duration<_Rep, _Period>&) -> unique_lock<_Mutex>;

不幸的是,clang 不接受这个:

error: extraneous template parameter list in template specialization or out-of-line template definition

GCC 对此有更好的错误消息:

error: too many template-parameter-lists

您可以将其更改为单个模板参数列表,如下所示:

template<typename _Mutex, typename _Rep, typename _Period>
unique_lock(_Mutex &, const chrono::duration<_Rep, _Period>&) -> unique_lock<_Mutex>;

并且有效。

从您问题中的评论来看,您似乎混合了 CTAD 和专业化。

您没有专攻 unique_lock。不是成员函数,也不是构造函数,你只是在定义一个推导指南。 更具体地说,来自 cppreference:

The syntax of a user-defined deduction guide is the syntax of a function declaration with a trailing return type [...] A deduction guide is not a function [...]

注意它有声明的语法,而不是特化。只是和你想象的不一样而已。