Оглавление

Регистрация оператора отношений

Часто бывает необходимо использование операторов отношения, для этого их нужно зарегистрировать.

Оператор индекса

Используется для доступа к элементу из массива по индексу.
// Простая реализация оператора индекса
int &MyClass::operator[] (int index)
{
  return internal_array[index];
}

// Неизменяемый вариант который работает для константных ссылок на обьект
const int &MyClass::operator[] (int index) const
{
  return internal_array[index];
}

// Регистрирует константый и неконстантный варианты для сохранения const-корректности
r = engine->RegisterObjectBehaviour("mytype", asBEHAVE_INDEX, "int &f(int)", asMETHODPR(MyClass, operator[], (int), int&), asCALL_THISCALL); assert( r >= 0 );
r = engine->RegisterObjectBehaviour("mytype", asBEHAVE_INDEX, "const int &f(int) const", asMETHODPR(MyClass, operator[], (int) const, const int&), asCALL_THISCALL); assert( r >= 0 );

Оператор преобразования типа

Используются для преобразования типов в скрипте. Отличается от преобразования ссылки тем, что создает новое значение.

Регистрация как asBEHAVE_VALUE_CAST или asBEHAVE_IMPLICIT_VALUE_CAST позволяет движку знать яввляется ли преобразование косвенным.

// Преобразует строку в число
int ConvStringToInt(const std::string &s)
{
  return atoi(s.c_str());
}

// Регистрируем отношение
r = engine->RegisterObjectBehaviour("string", asBEHAVE_VALUE_CAST, "int f() const", asFUNCTION(ConvStringToInt), asCALL_CDECL_OBJLAST); assert( r >= 0 );

Возвращаемый тип оператора преобразования должен быть bool или void. Преобразование значение создаст новое значение, поэтому если функция возвращает указатель или хендл, помните что он указывает на новое значение а не на оригинальное.


Перевод - arroy.one@gmail.com. При копировании материалов указывайте ссылку на источник.