我正在尝试模板化一些转换运算符函数来接受各种算术类型,即有符号/无符号整数/浮点类型,因此有 4 个不同的函数模板定义,我已经包含了其中的几个。
template<typename UnsignedInteger>
operator std::enable_if_t<
std::is_integral_v<UnsignedInteger> &&
!std::is_signed_v<UnsignedInteger>,
UnsignedInteger
> (){...}
template<typename SignedInteger>
std::enable_if_t<
is_signed == true ||
std::is_integral_v<SignedInteger> &&
std::is_signed_v<SignedInteger>,
SignedInteger
>operator (){...}
它们的用法可能类似于:
fixed<32, 1024> fixed = 32; // implicit constructor invoked, definition not included
uint64_t someFloat = fixed; // conversion invoked
当我尝试使用隐式转换时,对于此转换,我得到了相当通用的错误
note: candidate template ignored: couldn't infer template argument 'UnsignedInteger'
。当我删除enable_if约束时,转换运算符被正确创建,尽管只有在转换函数存在/实现时,自然地。
我只能访问 c++ 17。
谢谢!
问题在于,将模板参数封装到
std::enable_if
中使其成为非推导上下文,模板参数无法被推导。
您可以将条件移至模板参数。例如
template<typename UnsignedInteger, std::enable_if_t<std::is_integral_v<UnsignedInteger> && !std::is_signed_v<UnsignedInteger>, void>* = nullptr>
operator UnsignedInteger (){ ... }
template<typename SignedInteger, std::enable_if_t<std::is_integral_v<SignedInteger> && std::is_signed_v<SignedInteger>, void>* = nullptr>
operator SignedInteger (){ ... }