2012-05-30 42 views
1

自从片刻以来,有一件事让我的大脑产生了困扰:我试图根据返回类型重载[]运算符。这是我需要做的:返回类型的重载运算符[]返回类型

class A { 

private: 
    double* data_; 
    int N_; 
public: 
    A (N=0):N_(N){ 
     data_ = new double[N]; 
    } 
    ~A {delete[] data_;} 

    double operator[] (const int i) { 
     return data_[i]; 
    } 

    double* operator[] (const int i) { 
     return &data[i]; // for example; in fact here i need to return some block of data_ 
    } 
}; 

这段代码不会编译;这是我的问题。有人可以帮我解决这个问题吗?

PS:我知道如何重载返回类型,例如正常功能:

int foo(); 
string foo(); 

我使用了一些技巧,我在这个论坛上阅读。这样:

struct func { 
    operator string() { return "1";} 
    operator int() { return 2; } 
}; 

int main() { 
    int x = func(); // calls int version 
    string y = func(); // calls string version 
    double d = func(); // calls int version 
    cout << func() << endl; // calls int version 
    func(); // calls neither 
} 

谢谢。

+6

“* PS:我知道如何在返回类型上重载正常函数,例如*”你确定吗? – ildjarn

+0

你在说什么论坛? – Paulpro

+0

您能告诉我们如何纯粹重载类型吗?我想很多人也想知道,因为他们不知道... – PlasmaHH

回答

14

两种方法重载必须有不同签名。返回类型不是方法签名的一部分。

+2

+1; C++ 11 citation,§1.3.20:“*** signature ** <类成员函数>:名称,参数类型列表,函数所属的类,cv-qualifiers(如果有)和ref-限定符(如果有的话)*“ – ildjarn

0

也许你需要类似的东西:

class A { 

private: 
    double* data_; 
    int N_; 
    ... // other stuff 
public: 
    double operator[] (const int i) const { // note const here 
     return data_[i]; 
    } 

    double& operator[] (const int i) { // note reference here 
     return data_[i]; 
    } 
}; 

运营商也应该是公开的有感觉。

+0

实际上我需要的是返回2个double的集合{data_ [i],data_ [i + 1]}(这可以通过使用一些SSE内部函数来实现)...... – moose

+0

请注意,在像我写的操作符定义之后,您可以像这样使用它:'&object [i]',您将得到您需要进行其他处理的地址/指针。 –

4

您可以使用相同的“绝招”,您使用的功能,那就是使用代理对象与转换操作符:

class A 
{ 
    private: 
    double* data_; 
    int N_; 
    public: 
    A (int N = 0) 
     : N_(N), data_(new double[N]) 
    {} 
    ~A() { delete[] data_; } 

    struct proxy 
    { 
     int i; 
     double * data; 
     operator double() const 
     { 
      return data[i]; 
     } 

     operator double*() 
     { 
      return &data[i]; 
     } 

     operator double const *() const 
     { 
      return &data[i]; 
     } 
    }; 

    proxy operator[] (int const i) { 
     proxy p { i, data_ };   
     return p; 
    } 

    proxy const operator[] (int const i) const { 
     proxy p { i, data_ };   
     return p; 
    } 
}; 

int main() 
{ 
    { 
    A a(12); 

    double d = a[0]; 
    double * pd = a[0]; 
    } 

    { 
    A const ca(12); 

    double d = ca[0]; 
    //double * pd = ca[0]; // does not compile thanks to overloads on const 
    double const * pcd = ca[0]; 
    } 
} 

但是,我认为,这是一个可怕的想法。让你的operator[]返回一个值或者指向这个值的指针保证会让你的类的用户感到困惑,除了使它们在两种类型都有可能的表达式中使用是不切实际的。例如,std::cout << a[0];不会编译(模糊过载)。

+0

不错的努力,但+1提到它是一个*糟糕的*想法。 – Eric

+0

谢谢!最后我决定创建另一个成员函数,而不是重载'operator []' – moose