Имитация индексатора C # в C ++ - PullRequest
4 голосов
/ 13 ноября 2010

Как вы знаете, в классах C # мы можем определить индексатор с более чем одним аргументом.Но в C ++ оператор [] может принимать один аргумент.Есть ли способ записать индексатор в C ++ с более чем одним аргументом?

индексатор в C #:

public AnyType this[arg1 , arg2 , .....]
{
    get { ... };
    set { ... };
}

[] оператор в C ++:

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

Ответы [ 3 ]

3 голосов
/ 13 ноября 2010

Вы можете вернуть временный объект, который содержит первый индекс и имеет ссылку на источник данных.

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_;
}
2 голосов
/ 13 ноября 2010

Вы можете использовать std::pair, std::tuple или boost::tuple в качестве аргумента operator[] для эффективного достижения того же самого.

2 голосов
/ 13 ноября 2010

Нет, к сожалению, оператор [] в C ++ принимает только один аргумент.Лучшее, что вы можете сделать для аппроксимации синтаксиса с несколькими аргументами, это перегрузить оператор ().Этот подход используется классом матрицы в библиотеке линейной алгебры Boost, поэтому вы можете искать по (row, column).

Альтернативный подход - заставить оператор [] вернуть прокси-класс, который также имеет перегруженный *Оператор 1007 *, допускающий синтаксис типа my_object[0][1].Это похоже на синтаксис, который вы получите при использовании собственных C N-мерных массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...