用C+中的[]运算符可以访问复数的实部和虚部吗+; 我在C++中使用 库。是否可以使用[]运算符访问复数的实部和复部?我想用myComplexNum[0]代替myComplexNum.real()和myComplexNum[1]代替myComplexNum.imag()
我尝试使用MingW 4.5.2进行此操作,但收到错误:用C+中的[]运算符可以访问复数的实部和虚部吗+; 我在C++中使用 库。是否可以使用[]运算符访问复数的实部和复部?我想用myComplexNum[0]代替myComplexNum.real()和myComplexNum[1]代替myComplexNum.imag(),c++,std,complex-numbers,C++,Std,Complex Numbers,我尝试使用MingW 4.5.2进行此操作,但收到错误:找不到“operator[]”的匹配项。。我现在真的需要使用[]操作符,否则我将不得不更改数百行代码 没有 您可以从std::complex派生并继承构造函数并添加重写的运算符[],但我建议不要这样做。不 您可以从std::complex派生并继承构造函数并添加重写的运算符[],但我建议不要这样做。如C++11中所述: 对于z类型的任何对象complex,reinterpret\u cast(z)[0]是z的实部,reinterpret\u
找不到“operator[]”的匹配项。
。我现在真的需要使用[]操作符,否则我将不得不更改数百行代码 没有
您可以从std::complex
派生并继承构造函数并添加重写的运算符[]
,但我建议不要这样做。不
您可以从std::complex
派生并继承构造函数并添加重写的运算符[]
,但我建议不要这样做。如C++11中所述:
对于z
类型的任何对象complex
,reinterpret\u cast(z)[0]
是z
的实部,reinterpret\u cast(z)[1]
是z
的虚部
对于名为p
的complex
数组元素和任何有效数组索引i
,reinterpret\u cast(p)[2*i]
是复数p[i]
的实部,reinterpret\u cast(p)[2*i+1]
是复数p[i]
您不能使用std::complex
执行此操作,但如果确实需要,您可以重新解释t*
或t(&)[2]
并使用操作符[]
如果可能,我建议创建一个访问器函数:
template <class T>
T & get(std::complex<T> & c, int index)
{
if(index == 0) return c.real();
else return c.imag();
}
模板
T&get(标准::复杂&c,整数索引)
{
if(index==0)返回c.real();
否则返回c.imag();
}
然后在需要时使用get(c,0)
和get(c,1)
。按照c++11:
对于z
类型的任何对象complex
,reinterpret\u cast(z)[0]
是z
的实部,reinterpret\u cast(z)[1]
是z
的虚部
对于名为p
的complex
数组元素和任何有效数组索引i
,reinterpret\u cast(p)[2*i]
是复数p[i]
的实部,reinterpret\u cast(p)[2*i+1]
是复数p[i]
您不能使用std::complex
执行此操作,但如果确实需要,您可以重新解释t*
或t(&)[2]
并使用操作符[]
如果可能,我建议创建一个访问器函数:
template <class T>
T & get(std::complex<T> & c, int index)
{
if(index == 0) return c.real();
else return c.imag();
}
模板
T&get(标准::复杂&c,整数索引)
{
if(index==0)返回c.real();
否则返回c.imag();
}
然后在需要的地方使用get(c,0)
和get(c,1)
。您必须在复杂类中包装std::complex:
class Complex {
public:
explicit Complex(std::complex& value) : m_value(value) {}
...
operator std::complex& () { return m_value; }
operator const std::complex& () const { return m_value; }
...
private:
std::complex m_value;
}
这对于将涉及std::complex的操作/函数的结果获取为complex是必需的。您必须将std::complex包装在您的complex类中:
class Complex {
public:
explicit Complex(std::complex& value) : m_value(value) {}
...
operator std::complex& () { return m_value; }
operator const std::complex& () const { return m_value; }
...
private:
std::complex m_value;
}
<>这对于获得STD的操作/函数的结果是必要的::复杂的,复杂的。你有没有?“我试着用明文和C99来做它”:澄清,这是C++,不是C,因此,如果您尝试使用C99,您可能会遇到很多问题。试图混淆代码?您可以将std::complex
转换为T(&)[2]
,此转换必须是安全的[complex.numbers]/4。因此,您可以使用template T(&)[2]obfuscate_complex(std::complex&p){return reinterpret_cast(p)}
,然后使用obfuscate_complex(myComplexNum)[1]
等等。我想知道为什么您编写了“数百行代码”,假设您可以在注意到它不起作用之前对复数进行索引。我的建议是,开始修复代码。(你可以写自己的代码>运算符[]/COD>,但我真的认为这不是最好的方法。你说吗?”我试图用MIW和C99来做这件事:“但是,澄清,这是C++,而不是C,所以如果你用C99尝试过,你可能会遇到很多问题。试图混淆你的代码?你可以把<代码> STD::复杂< /COD>转换成<代码> t(())[ 2 ]。
,此转换要求是安全的[complex.number]/4。因此,您可以使用template T(&)[2]obfuscate_complex(std::complex&p){return reinterpret_cast(p)}
,然后使用obfuscate_complex(myComplexNum)[1]
等等。我想知道为什么您编写了“数百行代码”,假设您可以在注意到它不起作用之前对复数进行索引。我的建议是,开始修复代码。(您可以编写自己的操作符[]
,但我真的认为这不是最好的方法。)使用get(c,0)
和get(c,1)
仍然需要更改代码。只要他这样做,为什么不把它改成使用c.real()
和c.imag()
?使用get(c,0)
和get(c,1)
仍然需要更改代码。只要他这么做,为什么不把它改成使用c.real()
和c.imag()
?请不要std::complex
不是为继承而设计的,这将导致长期的问题。不要将继承用于代码重用跨越操作符[]
是我最后的选择。但是我真的在试图避免它。@JaimeIvanCervantes我宁愿你使用std::array
然后将std::complex写入到_complex(std::array)
和std::array from_complex(std::complex)
当你需要一个std::complex
时,也不要做类似于t的事情