создание angelscript asSMethodPtr (без макроса asMETHOD)

Я пытаюсь получить более динамичный рабочий процесс с Angelscript, где я не полагаюсь на макрос asMETHOD для передачи информации о классе / методе в Angelscript.

Тем не менее, я не могу заставить его работать до сих пор.

Вот некоторые структуры, которые я определил (для настройки данных класса и метода):

struct Class {
std::string name;
std::string factorySignature;
void* pointer;
void* factoryPointer;
void* addRefMethodPointer;
void* releaseRefMethodPointer;
};struct Method {
std::string name;
std::string signature;
void* pointer;
};

Позже я пытаюсь создать asSMethodPtr Структура объекта с использованием объекта структуры класса, который я создал ранее. Вот что я делаю:

auto methodPtr = asSMethodPtr<sizeof(void (classObject.pointer)())>::Convert((void (classObject.pointer)())(classObject.addRefMethodPointer));

К сожалению, это приводит к следующим ошибкам:

src/common/as_wrapper/AngelScript.cpp:98:66: error: void value not ignored as it ought to be
src/common/as_wrapper/AngelScript.cpp:98:68: error: template argument 1 is invalid
src/common/as_wrapper/AngelScript.cpp:98:107: error: void value not ignored as it ought to be
src/common/as_wrapper/AngelScript.cpp:98:142: error: unable to deduce ‘auto’ from ‘<expression error>’

У кого-нибудь есть идеи? Я боюсь, что эта структура asSMethodPtr раздвигает границы моих возможностей C ++ …

0

Решение

Указатель на функцию-член имеет формат return_type (class_name:: *) (parameter_list) константные-volatile_qualifiers. Аргумент, который вы пытаетесь передать sizeof состоит из того, что выглядит как локальная переменная и переменная-член, и является плохо сформированным. Это должно выглядеть следующим образом

sizeof(void (Class::*)())

Аргумент, который вы передаете Convert также плохо сформирован. Вам нужно взять функцию-член по адресу, используя & адрес оператора. Другая проблема заключается в том, что addRefMethodPointer является переменной-членом, а не функцией, поэтому приведение не будет выполнено.

struct Class
{
void SomeMemberFunction() {}
};

(void (Class::*)())(&Class::SomeMemberfunction)
0

Другие решения

Других решений пока нет …