gpt4 book ai didi

C++:如何存储不同类的各种成员函数以备后用

转载 作者:搜寻专家 更新时间:2023-10-30 23:52:51 24 4
gpt4 key购买 nike

在此先感谢您的支持。

我正在使用 C++11,我想存储一些类的公共(public)成员函数以供以后用作回调函数;例如我想存储一些匹配这个模板的函数:void(classname::*)(void)。据我所知,我也必须存储他们的对象,这很好。例如:

// PSEUDO CODE
class A {
public:
void myfunc() {}
}myobj;

class B {
public:
void myfunc2() {}
}myobj2;

/* storing */
mystorageclass storage;
storage.push(&myobj, &A::myfunc);
storage.push(&myobj2, &B::myfunc2);

/* call them back */
(storage[0].object->*(storage[0].callback))();
(storage[1].object->*(storage[1].callback))();

是否有任何安全且通用的方法来做到这一点?实际上我找到了一种方法,但我不确定它在处理器或编译器之间的可移植性如何。

//test.cpp - compiled with: g++ test.cpp -o test -std=c++11
#include <iostream>
#include <vector>

class A {
public:
void myfunc() { std::cout << "Test A::myfunc()" << std::endl; }
}myobj;

class B {
public:
void myfunc2() { std::cout << "Test B::myfunc2()" << std::endl; }
}myobj2;

struct Callback {
void* object;
void(* method)(void*);
};

std::vector<Callback> callbackList;

template<typename FunctionPtr>
void add(void* object, FunctionPtr fptr) {
Callback cb;
cb.object = object;
cb.method = (void(*)(void*))(*(void**)(&fptr));
callbackList.push_back(cb);
}

int main() {
//add to list for later use
add(&myobj, &A::myfunc);
add(&myobj2, &B::myfunc2);

//call them back
callbackList[0].method(callbackList[0].object);
callbackList[1].method(callbackList[1].object);
}

还有另一种方法;我觉得这样更安全:

//test2.cpp - compiled with: g++ test2.cpp -o test2 -std=c++11
#include <iostream>
#include <vector>

class A {
public:
void myfunc() { std::cout << "Test A::myfunc()" << std::endl; }
}myobj;

class B {
public:
void myfunc2() { std::cout << "Test B::myfunc2()" << std::endl; }
}myobj2;

struct Callback {
struct A;
A* object;
void(A::* method)();
void call() {
(object->*method)();
}
};

std::vector<Callback> callbackList;

template<typename FunctionPtr>
void add(void* object, FunctionPtr fptr) {
Callback cb;
cb.object = (Callback::A*)object;
cb.method = (void(Callback::A::*)())(fptr);
callbackList.push_back(cb);
}

int main() {
//add to list for later use
add(&myobj, &A::myfunc);
add(&myobj2, &B::myfunc2);

//call them back
callbackList[0].call();
callbackList[1].call();
}

这些用法安全吗?或者你有什么建议而不是这些。谢谢。

最佳答案

替换Callbackstd::function<void()> .

替换add

template<class T, class R, class U>
void add(T* object, R(U::*ptr)()) {
Callback cb = [object, ptr]{ object->ptr(); };
callbackList.push_back(cb);
// or just
// callbackList.push_back([object, ptr]{ object->ptr(); });
}

请注意,这支持传递指向父成员函数的指针,以及不返回 void 和丢弃结果的回调。

std::function存储一个通用的“稍后调用”。您在 std::function<signature> 的模板签名参数中传递了一个与返回值兼容的类型,以及与您稍后要调用的内容兼容的参数。 .在这种情况下,<void()> .

关于C++:如何存储不同类的各种成员函数以备后用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43547502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com