Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用模板参数或std::函数替换函数指针?_C++_Sonarlint - Fatal编程技术网

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

C++ 如何用模板参数或std::函数替换函数指针?,c++,sonarlint,C++,Sonarlint,我在visualstudio中运行了一个Sonarint插件。 我的代码有一个主要问题,如下所示: _declspec(dllexport) void GetInformation(void (add)(const char* pCarName)) { add("N3-988"); add("N3-40"); add("N3-41"); add("N3-428"); } 错误是 cp

我在visualstudio中运行了一个Sonarint插件。 我的代码有一个主要问题,如下所示:

_declspec(dllexport) void GetInformation(void (add)(const char* pCarName))
{
    add("N3-988");
    add("N3-40");
    add("N3-41");
    add("N3-428");
}
错误是

cpp:S5205 : Replace this function pointer with a template parameter or a "std::function".

如何修复它?

这个错误是一个令人费解的问题。你输入了错误的函数指针语法,仅此而已。你需要

void (*add)(const char* pCarName)

作为参数类型
add
则是一个函数指针,它在函数体(
add(“N3-988”);
等)中的使用是适当的。

该错误是一个误导。你输入了错误的函数指针语法,仅此而已。你需要

void (*add)(const char* pCarName)

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

可能类似于以下内容

#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);
}
#包括
模板
无效获取信息(函数func)
{
func(“N3-988”);
func(“N3-40”);
func(“N3-41”);
func(“N3-428”);
}
int main()
{
自动函数=[](常量字符*s){printf(“%s\n”,s);};
获取信息(func);
}

可能类似于以下内容

#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);
}
#包括
模板
无效获取信息(函数func)
{
func(“N3-988”);
func(“N3-40”);
func(“N3-41”);
func(“N3-428”);
}
int main()
{
自动函数=[](常量字符*s){printf(“%s\n”,s);};
获取信息(func);
}

这不是一个真正的错误,因为您不能将函数指针用作参数。你可以。出于模糊性、灵活性和性能原因,不鼓励使用函数指针。看见因此,如果不考虑这些因素,您可能希望抑制它

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

_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::Fuff,如您所建议的,如果您不知道DLL将具有C++接口(因此将取决于C++运行时):

由于所谓的衰减,等效于函数指针参数:


建议将一个替换为另一个的答案是误导性的,它不会解决任何问题。

这不是一个真正的错误,从某种意义上说,您不能将函数指针用作参数。你可以。出于模糊性、灵活性和性能原因,不鼓励使用函数指针。看见因此,如果不考虑这些因素,您可能希望抑制它

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

_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::Fuff,如您所建议的,如果您不知道DLL将具有C++接口(因此将取决于C++运行时):

由于所谓的衰减,等效于函数指针参数:


建议将其中一个替换为另一个的答案是误导性的,它不会解决任何问题。

也许可以更明确地澄清,
void(add)(const char*pCarName)
是一种不能直接传递的函数类型“用模板参数或“std::function”替换此函数指针”。您没有执行任何操作“建议”。@Jarod42:没错。这就是编译器诊断的美妙之处。这有点像我告诉我女儿“不要想大象”,然后问她在想什么。@maximu_prime_是_463035818:除非你使用模板技巧,否则可能会炸毁
\u declspec(dllexport)
。后者是我回答中隐藏的考虑因素。也许可以更明确地澄清,
void(add)(const char*pCarName)
是一种不能直接传递的函数类型“用模板参数或“std::function”替换此函数指针”。您没有执行任何“建议”“@Jarod42:没错。这就是编译器诊断的美妙之处。这有点像我告诉我女儿“不要想大象”,然后问她在想什么。@magnize_prime_是_463035818:除非你使用模板技巧,否则可能会爆炸
\u declspec(dllexport)
。后者是我回答中隐藏的考虑因素。这个警告似乎是假的,只是压制它<代码>#pragma警告(抑制:S5205)警告似乎是假的,请抑制它<代码>#杂注警告(抑制:S5205)