将隐式促销添加到复杂类,最后一步
Add implicit promotion to complex class, last step
我想在求和时允许隐式转换。例如:
complex<double> a;
complex<long double> b;
int i;
auto sum = a + b; // (1)
auto SUM = a + i; // (2)
我的代码可以启用转换(1),这要归功于回答隐式类型的促销。为了启用(2)转换,我使用了enable_if_t
template <typename T, typename U>
auto operator +(const ::std::complex<T> &a, std::enable_if_t<std::is_arithmetic<U>::value, U> &b)
{
typedef decltype(::std::declval<T>() + ::std::declval<U>()) comcomp_t;
typedef ::std::complex<comcomp_t> result_t;
return ::std::operator +(result_t{a}, result_t{b});
}
但是,我遇到了一个汇编错误,说"无法推断模板paramter'u'。我猜我对Sfinae的理解非常浅。任何帮助都将不胜感激。谢谢
第二个参数是未建立的上下文。您必须重写此功能,以便实际推导U
。典型的方法是将Sfinae粘贴到返回类型中。
template <typename T, typename U>
using add_t = decltype(std::declval<T>() + std::declval<U>());
template <typename T, typename U>
auto operator+(const std::complex<T>& a, const U& b)
-> std::enable_if_t<std::is_arithmetic<U>::value,
std::complex<add_t<T, U>>>
{
std::complex<add_t<T, U>> res = a;
res += b;
return res;
}
我不确定您在这里需要Sfinae。最小工作C 14代码是:
#include <ccomplex>
#include <type_traits>
template <typename T, typename U>
using add_t = decltype(std::declval<T>() + std::declval<U>());
template <typename T, typename U>
constexpr std::complex<add_t<T, U>> operator+(const std::complex<T>& a,
const std::complex<U>& b) noexcept
{
using returnType = decltype(a + b);
return returnType(a.real() + b.real(), a.imag() + b.imag());
}
template <typename T, typename U>
constexpr std::complex<add_t<T, U>> operator+(const std::complex<T>& a,
const U& b) noexcept
{
using returnType = decltype(a + b);
return returnType(a.real() + b, a.imag());
}
template <typename T, typename U>
constexpr auto operator+(const T& a, const std::complex<U>& b) noexcept
{
return b + a; // assume commutativity of + operator
}
using namespace std;
int main()
{
constexpr complex<double> a;
constexpr complex<long double> b;
constexpr int i = 1;
constexpr auto s1 = a + b; // (1)
constexpr auto s2 = a + i; // (2)
constexpr auto s3 = i + a; // (3)
constexpr auto s4 = a + 2; // (4)
constexpr auto s5 = 2 + a; // (5)
}
注意:它也与constexpr
表达式一起使用。
相关文章:
- 维护unordered_map但同时每一步都需要最低的映射值
- 如何在最后一步使用CryptDecrypt解决NTE_BAD_DATA
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 斐波那契数列部分和的最后一位数字
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 将第 n 个斐波那契数的大斐波那契数的最后一位编程.C++
- 如何在 C++ 中返回到上一步
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- foor 循环的最后一次迭代中的指针更改
- 访问类成员向量最后一项的正确方法
- 从函数参数包中删除最后一项
- 如何一步一步地正确解释此代码?(编程新手)
- C++ 查找算法:如何找到元素的最后一次出现?
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 如何找到由公式计算的非常大的数字的最后一位数字?
- 通过GL_FLOAT,GL_UNSIGNED_INT一步
- 在 QSet 中插入元素<QString>并检索 ,删除 QSet 的最后一项
- 为什么除了最后一帧之外,每一帧都没有调用命令
- 将隐式促销添加到复杂类,最后一步
- 无法理解此代码的最后一步