首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用模板参数或std::function替换函数指针?

如何用模板参数或std::function替换函数指针?
EN

Stack Overflow用户
提问于 2021-03-16 11:01:53
回答 3查看 236关注 0票数 2

我在视听演播室里运行了一个声纳插件。我的代码有一个主要问题,如下所示:

代码语言:javascript
运行
复制
_declspec(dllexport) void GetInformation(void (add)(const char* pCarName))
{
    add("N3-988");
    add("N3-40");
    add("N3-41");
    add("N3-428");
}

错误是

代码语言:javascript
运行
复制
cpp:S5205 : Replace this function pointer with a template parameter or a "std::function".

怎么修呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-16 12:19:26

这不是一个真正的错误,从某种意义上说,不能使用函数指针作为参数。你可以的。由于模糊、灵活性和性能方面的原因,不鼓励使用函数指针。见https://jira.sonarsource.com/browse/RSPEC-5205。所以如果你不关心这些考虑的话,你可能会想抑制它。

缺乏灵活性意味着您无法传递额外的上下文(除非使用所谓的“块”)。这种缺乏灵活性的问题可以通过为用户上下文使用额外的void*参数来解决:

代码语言:javascript
运行
复制
_declspec(dllexport) void GetInformation(
   void (add)(const char* pCarName, void* context), void* context)
{
    add("N3-988", context);
    add("N3-40",  context);
    add("N3-41",  context);
    add("N3-428", context);
}

您还可以使用std::function (如建议的那样),如果您不知道DLL将具有C++接口(因此将取决于C++运行时):

代码语言:javascript
运行
复制
_declspec(dllexport) void GetInformation(std::function<void (const char*)> add)
{
    add("N3-988");
    add("N3-40");
    add("N3-41");
    add("N3-428");
}

请注意,您不能按照建议使用template,因为模板不能与__declspec(dllexport)一起从DLL导出。模板将具有固定的性能,因为避免了间接,但DLL接口意味着您无法避免它。

请注意,函数作为参数:

代码语言:javascript
运行
复制
void GetInformation(void (add)(const char* pCarName))

由于所谓的衰变,等价于函数指针参数

代码语言:javascript
运行
复制
void GetInformation(void (*add)(const char* pCarName))

建议用另一个代替一个的答案是误导的,它不会解决任何问题。

票数 1
EN

Stack Overflow用户

发布于 2021-03-16 11:04:41

这个错误是一条红鲱鱼。您错误地输入了函数指针语法,仅此而已。你需要

代码语言:javascript
运行
复制
void (*add)(const char* pCarName)

作为参数类型。然后,add是一个函数指针,它在函数体(add("N3-988");等)中使用。是合适的。

票数 3
EN

Stack Overflow用户

发布于 2021-03-16 11:09:42

也许如下所示

代码语言:javascript
运行
复制
#include <cstdio>

template<typename FuncT>
void GetInformation(FuncT func)
{
    func("N3-988");
    func("N3-40");
    func("N3-41");
    func("N3-428");
}

int main()
{
    auto func = [](const char* s){ printf("%s\n",s); };

    GetInformation(func);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66653884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档