gpt4 book ai didi

c++ - 将方法作为参数发送到另一个类

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:39 24 4
gpt4 key购买 nike

我真的不知道如何搜索这个,所以我要在这里问这个问题。我知道如何将函数作为参数传递,但这次情况有点不同,我有点迷茫。

出于可读性原因,我将简化这些类,但如果我遗漏了一些令人困惑的内容,请告诉我。

我有一个调用另一个函数的类:

class Class1 : public ofBaseApp {
public:
void setup() {
class2.bindMethod(&Class1::thatFunction);
}

void thatFunction(Signature signature) {}

Class2 class2;
}

然后是Class2:

#include "js_delegate.h"
class Class2 {
public:
void bindMethod(void (ofBaseApp::*func)(Signature signature)) {
JSDelegate(this, func);
}
}

以及JSDelegate的定义:

template < class X, class Y >
FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) {
m_Closure.bindmemfunc(detail::implicit_cast<X*>(pthis), function_to_bind); }

如果我想这样做,我会在 Class1 中收到一个错误,指出 ofApp::*ofBaseApp::* 不兼容。

我想使 bindMethod 通用,这样我就可以从继承自 ofBaseApp 的每个类传递函数。这可以用当前配置完成吗,或者您可以建议另一种方法来解决这个问题吗?

干杯

最佳答案

所以根据评论:

template <class class_type,class function_type>
void bind_base_method(function_type function, base& instance) {
static_assert(std::is_base_of<base,class_type>::value || std::is_same<base,class_type>::value, "class_type is not derived of base or base");
static_assert(std::is_member_function_pointer<function_type>::value, "Function is not a member function");
}

应根据需要为您工作。关于如何使用see here或使用下面的示例代码:

#include <functional>
#include <type_traits>
#include <iostream> //just form cout for demonstration

class base {
int number = 42;
public:
void a_method(void) {
std::cout << number << std::endl;
}
};

class derived : public base {

};

class another_class{
public:
void a_method(void) {
std::cout << 41;
}
};

template <class class_type,class function_type>
void bind_base_method(function_type function, base& instance) {
static_assert(std::is_base_of<base,class_type>::value || std::is_same<base,class_type>::value, "class_type is not derived of base or base");
static_assert(std::is_member_function_pointer<function_type>::value, "Function is not a member function");

//call like
auto this_will_call_the_method = std::bind(function, instance);

this_will_call_the_method();
}

int main(void)
{
derived foo;
bind_base_method<derived>(&derived::a_method, foo);

another_class bar;
//bind_base_method(&another_class::a_method, bar);//error won't work as wanted

return 0;
}

关于c++ - 将方法作为参数发送到另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33392076/

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