简单的方法将隐式类型促销添加到std ::复杂类操作员
Simple way to add implicit type promotion to the std::complex class operators
我想允许在两个复数时允许隐式转换
std::complex<double> a; std::complex<long double> b;
auto c = a+b;
我尝试在此处实现C 隐式类型转换使用模板
我定义了一个派生的STD :: Complex,我添加了应该允许隐式转换的朋友函数。这是我的代码:
template <typename T> class Complex : private std::complex<T> {
friend Complex operator+ (Complex const &lhs, Complex const &rhs) return Complex(); };
int main(){
Complex<double> C1; Complex<long double> C2;
auto Sum = C1+C2;
return(0); }
我不明白问题是在STD :: Complex的继承中还是在朋友函数中。任何帮助将不胜感激,谢谢
编辑:
当操作员的左右参数 均为std ::复杂时,全果代码效果很好。我还能允许操作复杂 int?
这是我的尝试:
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});
}
但是,当我尝试时:
int i=1;
auto sum = C1+i;
它不编译。"无法推断模板参数'u’"
为什么?
这可能是您想要的:
#include <complex>
#include <utility> // declval
template <typename T, typename U>
auto operator +(const ::std::complex<T> &a, ::std::complex<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});
}
auto test()
{
using ::std::complex;
complex<double> x{0, 0};
complex<long double> y{0, 0};
return x+y;
}
这需要"自动"(又名推论)返回类型的C 14。对于C 11,您基本上必须重复返回类型的操作员内部的decltype
表达式。
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用std::transform将一个范围的元素添加到另一个范围中
- 是否将std::packaged_task添加到现有线程
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 为什么"std::add_pointer"会添加之前删除的"const"?
- 在迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间访问?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- std 不包含,但它应该添加库
- 向 std::list 添加新元素的复杂性
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 我可以在"std"命名空间中添加推理指南吗?
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 如何将全局std::map添加到chaiscript
- 为什么 memcpy() 是一种将元素添加到 'std::map' 的方法?
- 在具有 std::p air 键和值的映射中添加 b2vec2
- 替换现有条目并在 std::map 中添加新条目
- 将 std::文件系统头文件添加到我的程序时出现编译错误
- 如何有条件地将元素添加到 std::array - C++11
- 将指向结构数组的指针添加到 std::map
- 在Visual Studio 2017中,有没有一种快速的方法可以将"std::"添加到缺少它的名称中?