如何使用模板化构造函数定义推导指南?
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 [...]
注意它有声明的语法,而不是特化。只是和你想象的不一样而已。
为了简化我的问题,我将使用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 [...]
注意它有声明的语法,而不是特化。只是和你想象的不一样而已。