gpt4 book ai didi

c++ - 向复杂类添加隐式提升,最后一步

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:20 24 4
gpt4 key购买 nike

我想在对复数求和时允许隐式转换。例如:

 complex<double> a; 
complex<long double> b;
int i;

auto sum = a + b; // (1)
auto SUM = a + i; // (2)

感谢回答 implicit type promotion in summing two complex<>,我有启用转换的代码 (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});
}

但是,我收到一个编译错误,提示“无法推断模板参数‘U’。我想我对 SFINAE 的理解非常肤浅。非常感谢任何帮助。谢谢

最佳答案

第二个参数是 non-deduced context 。您必须重写它,以便实际上可以推导出 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;
}

关于c++ - 向复杂类添加隐式提升,最后一步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47680152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com