Sfinae 模板化隐式转换运算符重载

问题描述 投票:0回答:1

我正在尝试模板化一些转换运算符函数来接受各种算术类型,即有符号/无符号整数/浮点类型,因此有 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。

谢谢!

c++ template-meta-programming
1个回答
0
投票

问题在于,将模板参数封装到

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 (){ ... }

直播

© www.soinside.com 2019 - 2024. All rights reserved.