gpt4 book ai didi

c++ - 如何使用继承形成一个通用的回调函数指针?

转载 作者:行者123 更新时间:2023-12-05 03:19:39 25 4
gpt4 key购买 nike

我正在尝试编写一个将通用函数指针作为参数的函数。假设你有一个 class A及其衍生品如下所示

class A {
};
class A1: public A {
};
class A2: public A {
};
class A3: public A {
};

我还有一个功能

void registerCallback(std::function<void(A*)> func_ptr) {
}

int main() {
std::function<void(A1*)> fptr= [&](A1*) {
cout << "dummy" <<endl;
};
registerCallback(fptr); /// throws error
}

它告诉你,不能转换std::function<void(A*)>std::function<void(A1*)>我该如何解决这个问题?

最佳答案

How can I solve this problem?

您可以使用 A*而不是 A1*fptr 的定义中.

std::function<void(A*)> fptr= [&](A*) {
cout << "dummy" <<endl;
};

不仅从句法的角度,而且从语义的角度,理解您的代码为什么错误是有指导意义的。

从句法上看,A1*可以用在哪里 A* where is expected -- 这是一个自动指针转换。然而,std::function<void(A1*)>不能在 std::function<void(A*)> 的地方使用是期待。没有自动转换。

如果不是这样,那么理解语义问题就更重要了语法错误。为了便于讨论,假设语言/编译器接受了您的代码。让我们进一步了解代码。将您的代码更新为以下内容:

class A {
};

class A1: public A {
public:
int int_var;
};

class A2: public A {
public:
double double_var;
};


class A3: public A {
public:
std::string string_var;
};

static std::function<void(A*)> registered_function_ptr;


void registerCallback(std::function<void(A*)> func_ptr) {
registered_function_ptr = fun_ptr;
}


void callRegisteredFunction(A* a_ptr) {
registered_function_ptr(a_ptr);
}

int main() {

std::function<void(A1*)> fptr= [&](A1* a1_ptr) {
// Expecting a pointer to an A1 object.
// Should be able to use members of A1.
cout << "int_var: " << a1_ptr->int_var << endl;
};


registerCallback(fptr);

A2 a2;
a2.double_var = 20;
// Syntactically correct.
callRegisteredFunction(&a2);

A3 a3;
a3.string_var = "Some string";
// Also syntactically correct.
callRegisteredFunction(&a3);
}

callRegisteredFunction被执行时,它调用注册的函数。在本例中为 fptr . fptr需要一个指向 A1 的指针对象,但我们可以用不同的对象间接调用它——它们没有 int_var .相反,他们有 double_varstring_var .这肯定会导致未定义的行为。编译器和语言会阻止您落入该陷阱。

关于c++ - 如何使用继承形成一个通用的回调函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73409841/

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