用C+中的[]运算符可以访问复数的实部和虚部吗+; 我在C++中使用 库。是否可以使用[]运算符访问复数的实部和复部?我想用myComplexNum[0]代替myComplexNum.real()和myComplexNum[1]代替myComplexNum.imag()

用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

我尝试使用MingW 4.5.2进行此操作,但收到错误:
找不到“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的事情