C++ 最简单的本机实现或与std::function等效的实现,用于回调函数

C++ 最简单的本机实现或与std::function等效的实现,用于回调函数,c++,lambda,callback,C++,Lambda,Callback,我正在类内部实现回调方法,当前正在工作的实现使用std::function,但是,STL在我使用的环境中不可用。我试图了解本机实现如何实现相同的结果。我尝试过使用函数指针,但这不适用于lambda表达式回调 下面是一个使用std::function尝试实现的工作示例 #include <iostream> #include <functional> using namespace std; class MyClass { public: MyCl

我正在类内部实现回调方法,当前正在工作的实现使用
std::function
,但是,STL在我使用的环境中不可用。我试图了解本机实现如何实现相同的结果。我尝试过使用函数指针,但这不适用于lambda表达式回调

下面是一个使用
std::function
尝试实现的工作示例

#include <iostream>
#include <functional>

using namespace std;
class MyClass {
    public:
        MyClass(std::function<void(void)> callback): _callback(callback) {}
        void call() {
            _callback();
        }
    private:
        std::function<void(void)> _callback;
};

class MyOtherClass {
    public:
        MyOtherClass() {}
        MyClass mc = MyClass([this]() { myInt++; });
        void callFiveTimes() {
            for(int i = 0; i < 5; i++) {
                mc.call();
            }
        }
        void printInt() {
            cout << myInt << endl;
        }
    private:
        int myInt = 0;

};


int main()
{
    MyOtherClass moc = MyOtherClass();
    moc.printInt();
    moc.callFiveTimes();
    moc.printInt();
    return 0;
}
#包括
#包括
使用名称空间std;
类MyClass{
公众:
MyClass(std::函数回调):\u回调(回调){}
无效调用(){
_回调();
}
私人:
std::函数_回调;
};
类MyOtherClass{
公众:
MyOtherClass(){}
MyClass mc=MyClass([this](){myInt++;});
void callFiveTimes(){
对于(int i=0;i<5;i++){
mc.call();
}
}
void printInt(){

它是否已经在没有外部库的情况下编译。您可以通过删除括号内的
void
来替换它。如果您不能使用函数指针,那么您将需要“重新创建”
std::function
。那么为什么不添加原始的
std::function
(它的模板,所以可能不需要库,只需要头文件)从编译器的STL不使用完整的STL?@ L.F.NO,它不编译而不使用STL……这不回答问题。@ SkLoLT能提供一个如何“重新创建”函数类型的例子吗?@弥敦STL不是外部库。标准库是C++的一部分。如果您想减慢开发过程和在重新发明它时,您可以查看代码审查。请注意,如果您正在评估它是否符合标准,它不会实现强制性的小对象优化。它已经在没有外部库的情况下编译。您可以通过删除括号内的void来替换它。如果您不能使用函数指针,那么您将需要“重新发明”
std::function
。那么为什么要这样做而不是添加原始的
std::function
(它的模板,所以可能不需要库,只需要头文件)从编译器的STL不使用完整的STL?@ L.F.NO,它不编译而不使用STL……这不回答问题。@ SkLoLT能提供一个如何“重新创建”函数类型的例子吗?@弥敦STL不是外部库。标准库是C++的一部分。如果您想减慢开发过程和在重新发明它的时候,你可以看看代码审查。注意,如果你正在评估它是否符合标准,它没有实现强制性的小对象优化。
#include <iostream>

using namespace std;
class MyClass {
    public:
        MyClass(void(*callback)(void*), void* callback_arg): _callback(callback), _callback_arg(callback_arg) {}
        void call() {
            _callback(_callback_arg);
        }
    private:
        void (*_callback)(void*);
        void* _callback_arg;
};

class MyOtherClass {
    public:
        MyClass* mc;
        MyOtherClass() {
            auto callback=[this](){ myInt++; };
            mc = new MyClass([](void* arg){ (*static_cast<decltype(callback)*>(arg))(); },&callback);
        }
        void callFiveTimes() {
            for(int i = 0; i < 5; i++) {
                mc->call();
            }
        }
        void printInt() {
            cout << myInt << endl;
        }
    private:
        int myInt = 0;

};


int main()
{
    MyOtherClass moc = MyOtherClass();
    moc.printInt();
    moc.callFiveTimes();
    moc.printInt();
    return 0;
}