Как вызвать функцию-член класса из двух указателей void - PullRequest
0 голосов
/ 26 мая 2020

Итак, для этой функции:

template<typename T>
T popObject(ScriptObject obj) { //Preforms a cast from void* on each to its type.
    assert(obj.getType() == std::type_index(typeid(T))); //Ensure type Safety.
    return obj.get<T>();
}

template <typename C, typename...Args>
    void bind(const char* name, C* context, void(C::* function)(Args...)) {
        std::vector<std::type_index> arguments = { std::type_index(typeid(Args))... };
        auto functor = [](void* func,void* contex, std::vector<ScriptObject> stack) {
            std::size_t idx = 0;
            //Call class context -> function (Args...)
        };
        _functions[name] = new BoundFunction(functor, void_cast(function), context, arguments);
    }

Я не уверен в синтаксисе для вызова функции-члена.

Iv пробовал:

union MF{
    void(C::* pf)(Args...);
    void* p;
} mf;
mf.p = func;
contex->*(mf.pf)(popObject<Args>(stack[idx++])...);

Что делает не компилируется, заявляя: «Не оценивает функцию, принимающую 1 аргумент.»

Пробовал std :: invoke, но я не знаю, как указать подпись функции-члена для arg1.

Итак, если у меня есть ссылка на функцию-член и ссылку на экземпляр класса, а также информацию о шаблоне для получения информации о типе. Как вызвать функцию-член Classes?

1 Ответ

1 голос
/ 26 мая 2020

Спасибо @Igor Tandentnik

Окончательное решение было:

(static_cast<C*>(ctx)->*(mf.pf))(popObject<Args>(stack[idx++])...);

Как указал Игорь, оно должно быть -> * вместо. *, И добавлены круглые скобки, как -> имеет более низкий приоритет, чем оператор вызова функции.

Также спасибо @TheFloatingBrain за указание на дополнительный static_cast

...