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

标签 c++ c++14 sfinae

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

 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/

相关文章:

C++ 智能指针范围和资源删除

c++ - 在没有隐式转换的情况下在编译时检测运算符

c++ - 尾随返回类型中 SFINAE 的 GCC 错误

c++ - 二进制文件输入、输出和追加 C++

c++ - 强行杀死线程 C++ win32

c++ - 使 2 个非静态字段(即动态数组)使用彼此靠近的内存

c++ - 是否可以包装 C 风格的回调,以便您可以将 C++ lambda 与它们一起使用?

c++ - 用于检查给定类型是否存在 istream 运算符 >> 的类型特征

c++ - 为什么我指向 std::vector 元素的指针在 push_back() 之后改变了它的值?

c++ - 在 C++ 中部分特化模板类