C++结构中的回调
callback in C++ struct
我一直在尝试用c++实现一个回调函数。在 class 中,我有一个结构、许多方法和一个创建结构实例的方法,其中一个方法作为其参数。
该结构还有许多其他变量,但此处描述了一个示例:
class MYCLASS
{
public:
MYCLASS();
struct TEST{
std::function<int(int)> foo;
};
int plus(int x){
return x + 1;
}
int minus(int x){
return x - 1;
}
void sim(){
TEST T; // make an instance of TEST
T.foo = plus(5); // assign TEST.foo a function (plus or minus)
T.foo(); // call the method we assigned
}
};
在 sim
方法中,我想创建一个 test
的实例,并根据某些条件给它 plus
或 minus
。我尝试给实例 T
一个 plus
函数并随后调用它的两行都是不正确的。
如果您想延迟对 T.foo
的调用,那么您可以使用这样的 lambda:
T.foo = [this](int x) { return plus(x); };
T.foo(5);
选项 - 1
如果成员函数 plus()
和 minus()
像您展示的那样足够简单,您可以将它们作为结构 TEST
中的 lambda 函数。
由于 无捕获 lambdas 可以存储在 类型化函数指针 中,以下将执行您想要的操作。
See live demo
#include <iostream>
class MYCLASS
{
int m_var = 5; // just for demonstration
public:
MYCLASS() = default;
struct TEST
{
using fPtrType = int(*)(int); // function pointer type
const fPtrType foo1 = [](int x) { return x + 1; }; // plus function
const fPtrType foo2 = [](int x) { return x - 1; }; // minus function
};
void sim()
{
TEST T;
std::cout << "Answer from int PLUS(int): " << T.foo1(m_var) << std::endl;
std::cout << "Answer from int MINUS(int): " << T.foo2(m_var) << std::endl;
}
};
选项 - 2
如果上面的代码在你的代码中发生了很大的变化,请再次为成员函数使用类型化函数指针并执行以下操作;这将避免不必要的复制(通过捕获)class实例到lambda和模板实例化和其他performance issues comes along with std::function
还有。
#include <iostream>
class MYCLASS
{
using fPtrType = int(MYCLASS::*)(int); // class member function pointer type
public:
MYCLASS() = default;
struct TEST { fPtrType foo = nullptr; };
int plus(int x) { return x + 1; }
int minus(int x) { return x - 1; }
void sim()
{
TEST T;
T.foo = &MYCLASS::plus; // now you can
std::cout << "Answer from int PLUS(int): " << (this->*T.MYCLASS::TEST::foo)(5) << std::endl;
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ syntax would be a bit ugly
// later same ptr variable for minus()
T.foo = &MYCLASS::minus;
int answer = (this->*T.MYCLASS::TEST::foo)(5);
std::cout << "Answer from int MINUS(int): " << answer << std::endl;
}
};
int main()
{
MYCLASS obj;
obj.sim();
return 0;
}
输出:
Answer from int PLUS(int): 6
Answer from int MINUS(int): 4
我一直在尝试用c++实现一个回调函数。在 class 中,我有一个结构、许多方法和一个创建结构实例的方法,其中一个方法作为其参数。
该结构还有许多其他变量,但此处描述了一个示例:
class MYCLASS
{
public:
MYCLASS();
struct TEST{
std::function<int(int)> foo;
};
int plus(int x){
return x + 1;
}
int minus(int x){
return x - 1;
}
void sim(){
TEST T; // make an instance of TEST
T.foo = plus(5); // assign TEST.foo a function (plus or minus)
T.foo(); // call the method we assigned
}
};
在 sim
方法中,我想创建一个 test
的实例,并根据某些条件给它 plus
或 minus
。我尝试给实例 T
一个 plus
函数并随后调用它的两行都是不正确的。
如果您想延迟对 T.foo
的调用,那么您可以使用这样的 lambda:
T.foo = [this](int x) { return plus(x); };
T.foo(5);
选项 - 1
如果成员函数 plus()
和 minus()
像您展示的那样足够简单,您可以将它们作为结构 TEST
中的 lambda 函数。
由于 无捕获 lambdas 可以存储在 类型化函数指针 中,以下将执行您想要的操作。
See live demo
#include <iostream>
class MYCLASS
{
int m_var = 5; // just for demonstration
public:
MYCLASS() = default;
struct TEST
{
using fPtrType = int(*)(int); // function pointer type
const fPtrType foo1 = [](int x) { return x + 1; }; // plus function
const fPtrType foo2 = [](int x) { return x - 1; }; // minus function
};
void sim()
{
TEST T;
std::cout << "Answer from int PLUS(int): " << T.foo1(m_var) << std::endl;
std::cout << "Answer from int MINUS(int): " << T.foo2(m_var) << std::endl;
}
};
选项 - 2
如果上面的代码在你的代码中发生了很大的变化,请再次为成员函数使用类型化函数指针并执行以下操作;这将避免不必要的复制(通过捕获)class实例到lambda和模板实例化和其他performance issues comes along with std::function
还有。
#include <iostream>
class MYCLASS
{
using fPtrType = int(MYCLASS::*)(int); // class member function pointer type
public:
MYCLASS() = default;
struct TEST { fPtrType foo = nullptr; };
int plus(int x) { return x + 1; }
int minus(int x) { return x - 1; }
void sim()
{
TEST T;
T.foo = &MYCLASS::plus; // now you can
std::cout << "Answer from int PLUS(int): " << (this->*T.MYCLASS::TEST::foo)(5) << std::endl;
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ syntax would be a bit ugly
// later same ptr variable for minus()
T.foo = &MYCLASS::minus;
int answer = (this->*T.MYCLASS::TEST::foo)(5);
std::cout << "Answer from int MINUS(int): " << answer << std::endl;
}
};
int main()
{
MYCLASS obj;
obj.sim();
return 0;
}
输出:
Answer from int PLUS(int): 6
Answer from int MINUS(int): 4