是否可以使用其指针和 void 对象指针来调用成员函数?
Is it possible to call a member function with its pointer and a void object pointer?
只有void*
指向特定实例的指针和returnType(*function)(parameters)
函数指针时,是否可以调用具有特定对象实例的成员函数?
#include <iostream>
class testClass
{
public:
int classNum;
testClass(int _num) : classNum(_num) {}
void testFunction(int _num) { std::cout << _num + classNum << "\n"; }
};
int main()
{
testClass instance(3);
void(*function)(int) = (&testClass::testFunction); // edit: this is wrong, but "&test::testFunction" is the information provided nonetheless
void* instancePtr = (void*)&instance;
// can we call "testFunction(3)" on "instance" with only "function" and "instancePtr"?
}
否;你有两个问题:
指向成员函数的指针类型错误,不会绑定到 (&testClass::testFunction)
。
对象指针的类型已被擦除。如果你知道它是什么,你可以将它从 void*
转换回 testClass*
,但是你永远不需要它是 void*
,对吗?
总的来说,像 lambda 和 std::function
这样的魔术组合会更优越。
这里有一些魔法:
int main()
{
testClass instance(3);
std::function<void(void*, int)> f = [](void* instancePtr, int _num) {
static_cast<testClass*>(instancePtr)->testFunction(_num);
};
void* instancePtr = &instance;
f(instancePtr, 42);
}
不过,您的选择实际上取决于您要做什么。
您需要将指针类型更改为void(*function)(void*, int)
,以便它可以接受指向对象的指针和参数。示例:
int main() {
testClass instance(3);
void(*function)(void*, int) = [](void* p, int a) { static_cast<testClass*>(p)->testFunction(a); };
void* instancePtr = &instance;
function(instancePtr, 3);
}
只有void*
指向特定实例的指针和returnType(*function)(parameters)
函数指针时,是否可以调用具有特定对象实例的成员函数?
#include <iostream>
class testClass
{
public:
int classNum;
testClass(int _num) : classNum(_num) {}
void testFunction(int _num) { std::cout << _num + classNum << "\n"; }
};
int main()
{
testClass instance(3);
void(*function)(int) = (&testClass::testFunction); // edit: this is wrong, but "&test::testFunction" is the information provided nonetheless
void* instancePtr = (void*)&instance;
// can we call "testFunction(3)" on "instance" with only "function" and "instancePtr"?
}
否;你有两个问题:
指向成员函数的指针类型错误,不会绑定到
(&testClass::testFunction)
。对象指针的类型已被擦除。如果你知道它是什么,你可以将它从
void*
转换回testClass*
,但是你永远不需要它是void*
,对吗?
总的来说,像 lambda 和 std::function
这样的魔术组合会更优越。
这里有一些魔法:
int main()
{
testClass instance(3);
std::function<void(void*, int)> f = [](void* instancePtr, int _num) {
static_cast<testClass*>(instancePtr)->testFunction(_num);
};
void* instancePtr = &instance;
f(instancePtr, 42);
}
不过,您的选择实际上取决于您要做什么。
您需要将指针类型更改为void(*function)(void*, int)
,以便它可以接受指向对象的指针和参数。示例:
int main() {
testClass instance(3);
void(*function)(void*, int) = [](void* p, int a) { static_cast<testClass*>(p)->testFunction(a); };
void* instancePtr = &instance;
function(instancePtr, 3);
}