在C ++中模拟C#索引器

时间:2010-11-13 15:23:47

标签: c++ indexing

正如您在C#类中所知,我们可以定义一个具有多个参数的索引器。 但是在C ++中,operator []可以接受一个参数。有没有办法在C ++中使用多个参数来表达索引器?

C#中的索引器:

public AnyType this[arg1 , arg2 , .....]
{
    get { ... };
    set { ... };
}
C ++中的

[]运算符:

AnyType & operator [] ( arg )
{
   // our code  
}

3 个答案:

答案 0 :(得分:3)

您可以返回一个临时文件,该文件包含第一个索引并具有数据源的引用。

private:
    class BoundArg {
    private:
        Data& data;
        size_t i; 
    public:
        BoundArg (etc.)

        value_type& operator [] ( size_t j ) {
           return data.get ( i, j );
        }
    };

public:
value_type& get ( size_t i, size_t j ) ...

BoundArg operator [] ( size_t i )
{
   return BoundArg ( *this, i );
}

通常它不值得复杂,除非你有一个二维数组存储为一维数组,在这种情况下临时只是指向数组某处的指针。

public:
value_type& get ( size_t i, size_t j ) { 
   return data_ [ i * rowWidth_ + j ];
}

value_type* operator [] ( size_t i )
{
   return data_ + i * rowWidth_;
}

答案 1 :(得分:2)

不,不幸的是,C ++中的[]运算符只接受一个参数。用于估计多参数语法的最佳方法是重载()运算符。这种方法由Boost线性代数库中的矩阵类使用,因此您可以按(row, column)进行查找。

另一种方法是让[]运算符返回一个代理类,该代理类也有一个重载的[]运算符,允许使用my_object[0][1]之类的语法。这类似于使用原生C N维数组获得的语法。

答案 2 :(得分:2)

您可以使用std::pairstd::tupleboost::tuple作为operator[]的参数来实现同样的目标。