C++ 在C+中模拟C#indexer+;

C++ 在C+中模拟C#indexer+;,c++,indexing,C++,Indexing,正如您所知,在C#类中,我们可以使用多个参数定义indexr。 但是C++中的操作符[]可以接受一个参数。有没有一种方法可以在C++中用多个参数来处理索引器? C#中的索引器: < C++ >运算符: AnyType & operator [] ( arg ) { // our code } 不,不幸的是,C++中的 []/COND>运算符只使用一个参数。近似多参数语法的最佳方法是重载()运算符。Boost线性代数库中的矩阵类使用这种方法,因此您可以通过(行、列)进行查找 另

正如您所知,在C#类中,我们可以使用多个参数定义indexr。 但是C++中的操作符[]可以接受一个参数。有没有一种方法可以在C++中用多个参数来处理索引器? C#中的索引器:

< C++ >运算符:

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

<>不,不幸的是,C++中的<代码> []/COND>运算符只使用一个参数。近似多参数语法的最佳方法是重载
()
运算符。Boost线性代数库中的矩阵类使用这种方法,因此您可以通过
(行、列)
进行查找


另一种方法是让
[]
操作符返回一个代理类,该类也有一个重载的
[]
操作符,允许使用类似
my_object[0][1]
的语法。这与本机C N维数组的语法类似。

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

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 );
}
通常不值得这么复杂,除非您将2D数组存储为1D数组,在这种情况下,临时数组只是指向数组中某个位置的指针

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_;
}

您可以使用
std::pair
,或作为
运算符[]
的参数来有效地实现相同的功能。

C#也不支持具有多个参数的索引器。这在4.0版中已更改,但仅适用于COM互操作。@HansPassant C#很乐意让您执行此[params object[]args]。不确定这是否是新的,但技术上应该是一个较低的一个论点。而且,我对C++没有太熟悉,但也许你可以做一些令人难以置信的可怕的事情,比如让索引器接受元组/序列对象参数,并重载逗号运算符自动构造这个元组。(我……65%确定这是可能的,100%确定我不知道你会怎么做,110%确定人们可能会因为对任何参数类型全局重载逗号而责骂你。)他还可以对pairs重载[]运算符。
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_;
}