function-pointers 相关问题

函数指针是指向函数的指针,该函数可以存储在变量中。它允许运行时选择运行哪个函数。

常量函数指针优化

我正在尝试使用结构内的函数指针在 C 中实现抽象接口。 像下面这样的东西 typedef int (*fn_t)(int); 类型定义结构 { 整数x; 常量 fn_t fnp; }

回答 1 投票 0

常数函数庞特的含义

我正在阅读其他人的代码,其中包含类似于 boost::function 或 std::function 的自定义函数类。他们通过不断的引用来传递这些函数类。合二为一

回答 1 投票 0

通用成员函数指针作为模板参数

考虑以下代码: #包括 使用命名空间 std; 班级你好{ 民众: 无效 f(){ 计算<<"f"< 考虑这段代码: #include <iostream> using namespace std; class hello{ public: void f(){ cout<<"f"<<endl; } virtual void ff(){ cout<<"ff"<<endl; } }; #define call_mem_fn(object, ptr) ((object).*(ptr)) template<R (C::*ptr_to_mem)(Args...)> void proxycall(C& obj){ cout<<"hello"<<endl; call_mem_fn(obj, ptr_to_mem)(); } int main(){ hello obj; proxycall<&hello::f>(obj); } 当然,这不会在第 16 行编译,因为编译器不知道 R、C 和 Args 是什么。但还有另一个问题:如果试图在 ptr_to_mem 之前定义这些模板参数,他会遇到这种糟糕的情况: template<typename R, typename C, typename... Args, R (C::*ptr_to_mem)(Args...)> // ^variadic template, but not as last parameter! void proxycall(C& obj){ cout<<"hello"<<endl; call_mem_fn(obj, ptr_to_mem)(); } int main(){ hello obj; proxycall<void, hello, &hello::f>(obj); } 令人惊讶的是,g++ 并没有抱怨 Args 不是模板列表中的最后一个参数,但无论如何它无法将 proxycall 绑定到正确的模板函数,只是指出它是一个可能的候选者。 有什么解决办法吗?我的最后一招是将成员函数指针作为参数传递,但如果我可以将它作为模板参数传递,它将更适合我的代码的其余部分。 编辑: 正如一些人指出的那样,这个例子似乎毫无意义,因为 proxycall 不会传递任何参数。在我正在处理的实际代码中,情况并非如此:参数是通过一些模板技巧从 Lua 堆栈中获取的。但这部分代码与问题无关,而且相当冗长,所以我不会将其粘贴到这里。 你可以尝试这样的事情: template <typename T, typename R, typename ...Args> R proxycall(T & obj, R (T::*mf)(Args...), Args &&... args) { return (obj.*mf)(std::forward<Args>(args)...); } 用途:proxycall(obj, &hello::f); 或者,要将 PTMF 变成模板参数,请尝试专业化: template <typename T, T> struct proxy; template <typename T, typename R, typename ...Args, R (T::*mf)(Args...)> struct proxy<R (T::*)(Args...), mf> { static R call(T & obj, Args &&... args) { return (obj.*mf)(std::forward<Args>(args)...); } }; 用途: hello obj; proxy<void(hello::*)(), &hello::f>::call(obj); // or typedef proxy<void(hello::*)(), &hello::f> hello_proxy; hello_proxy::call(obj); 在现代 C++ 中,可以使用 template<auto> 和通用 lambda 包装器: #include <utility> #include <functional> template<auto mf, typename T> auto make_proxy(T && obj) { return [&obj] (auto &&... args) { return (std::forward<T>(obj).*mf)(std::forward<decltype(args)>(args)...); }; } struct R {}; struct A {}; struct B {}; struct Foo { R f(A &&, const B &) { return {}; } //R f(A &&, const B &) const { return {}; } }; int main() { Foo foo; make_proxy<&Foo::f>(foo)(A{}, B{}); //make_proxy<static_cast<R (Foo::*)(A &&, const B &) const>(&Foo::f)>(std::as_const(foo))(A{}, B{}); //make_proxy<static_cast<R (Foo::*)(A &&, const B &)>(&Foo::f)>(foo)(A{}, B{}); } 如果存在重载,应该像注释代码中那样显式指定成员函数类型。

回答 2 投票 0

C++ 回调 ESP32 / Arduino 上的成员函数指针

在C++中这似乎是一件很难的事情。对 C 风格的类中的成员函数的回调,从而使其成为 void(*)() 以便能够在 C 风格的回调函数中使用 this。 在这种情况下,我...

回答 1 投票 0

如何定义有返回值的函数指针?

我想创建一个回调函数。下面的代码不起作用,但它显示了我想要做的事情。这是我在 Rust Playground 中损坏的程序的链接。 fn use_callback(回调:fn(...

回答 1 投票 0

C 风格的 C++ 函子包装器

这是我在最近的问题上尝试的进一步发展。 我想创建一个 bool(double, double) C 风格函数指针,指向具有兼容签名的仿函数。 (原因...

回答 1 投票 0

为什么在回调函数或其他用例中使用函数指针?

嵌入式 C 中函数指针的用例是什么以及为什么在回调函数中使用它?为什么我们不能使用正常的函数调用?不能用正常的函数调用吗? 我无法理解...

回答 1 投票 0

如何调用存储在 Box 中的 dyn 函数?

我有这个片段: 使用 std::sync::{Arc,互斥体}; pub 结构任务组 { 任务组:Arc dyn 迭代器>>>, } 实现任务组 { 夫...

回答 1 投票 0

将接受指针类型的函数指针转换为另一个接受引用类型的函数指针是否安全? [重复]

将接受“指针参数”的函数指针转换为另一个接受“引用参数”的函数指针有什么缺点? 考虑以下考试...

回答 1 投票 0

C 中的可变函数指针

我想实现一个函数,它接受一个函数及其参数,然后调用它。 我进行了很多搜索,但无法用可变参数函数来实现它。 我想要一种干净的方式来在 c 之后记录 stdio...

回答 1 投票 0

有没有一种解决方法可以将函数指针类型转换为 C 中的对象指针?

我有一个名为“bench”的函数,它接受一个返回 void 指针的函数指针(对于泛型)。 静态内联无符号长凳(void* (*funcPtr)(va_list), ...) 但如果我通过了...

回答 1 投票 0

指针是一个“未声明的标识符”

代码如下: // 模拟血型遗传 #包括 #包括 #包括 #包括 // 每个人都有两个父母...

回答 2 投票 0

为什么函数指针声明需要知道参数和返回值的类型?

为什么C中的函数声明需要知道所指向函数的参数和返回值的类型? c中的指针声明写法如下: 返回类型 ( *funcPtrName ) (

回答 2 投票 0

C 中的自定义 _printf 函数中无符号十六进制值的输出不正确

我无法从 C 中的自定义 _printf 函数获取正确的输出。该函数应该打印格式化输出,包括无符号的十六进制值。然而,

回答 1 投票 0

如何使用函数指针数组?

我应该如何在C中使用函数指针数组? 我如何初始化它们?

回答 13 投票 0

当放入自己的新函数时,部分函数会停止工作

编辑: 花了好几个小时的时间来处理这个问题让我犯了愚蠢的错误,而且对错误的管理不善。 在 u16 return_address 后面添加 [268] 是正确的答案,但我得到的错误......

回答 1 投票 0

C:当放入自己的新函数时,部分函数将停止工作

第一次来,希望标题没问题。 我有一个 .h 填充: JRAPI u64 list_directory_contents(char *目录); 在 .c 文件中,我有一个以以下开头的函数: u64 列表目录内容 (

回答 1 投票 0

如何在c中包装返回void *的函数

我目前正在c中函数指针的方向上进行一些探索,并且我模拟了一个我认为应该可行的小例子,但它反而产生了分段错误,而我并不真正...

回答 1 投票 0

C 中使用函数指针的正确语法

我已经阅读了函数指针的语法,但无法在我的代码中工作。 该视频解释了语法是: 类型 func0(type0 arg0, ..., typen argn){ // 做一点事 返回一个东西; ...

回答 1 投票 0

C++中调用构造函数和调用构造函数的函数指针有什么区别

问这个问题的目的是为了加深我的理解。 我试图动态加载本机 DLL,并注意到一个我无法理解的现象。 所以鉴于我的 DLL 有以下内容...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.