将参数传递给函数指针

时间:2016-07-05 21:22:19

标签: c++

我正在尝试将参数传递给作为参数传递的函数指针。

代码:

void Test(wchar_t* a, wchar_t* b)
{
    // ...
}

void Test2(void(*Func)(wchar_t*, wchar_t*))
{
    // ...
}

int main()
{
    Test2(Test(L"Hello", L"Testing"));
    return 0;
}

我收到此错误:

  

类型的参数" void"与" void(*)(wchar_t *,wchar_t *)"

类型的参数不兼容

如何解决这个问题以实现我想要实现的目标?

编辑:抱歉不清楚。我实际上要完成的是将一个函数注入子进程并传递两个参数(wchar_t *,wchar_t *),以便我可以使用它们。但是main函数可以是void或int argc,char ** argv。所以我通过简单地使用全局变量

完成了我想要实现的目标

3 个答案:

答案 0 :(得分:6)

你可能想要像

这样的东西
void Test2(void(*Func)(wchar_t*, wchar_t*),wchar_t* x, wchar_t* y)
{
    (*Func)(x,y);
}

int main()
{
    Test2(Test,L"Hello", L"Testing");
    return 0;
}

代替。

至于你的评论

  

如何在C ++中使用模板执行此操作?

我能想到

template<typename Param>
void Test2(void(*Func)(Param, Param), Param x, Param y) {
    (*Func)(x,y);
}

void Test(wchar_t* a, wchar_t* b);

int main() {
    Test2(Test,L"Hello", L"Testing");
    return 0;
}

这应该可以正常工作。

答案 1 :(得分:0)

有多种方法可以解决这个问题,但是,让我试着说明为什么会出现这种错误。

每个函数都有一种与之关联的值。这意味着,每个函数都会计算出某种类型的值。这由其返回值表示。

例如:

int foo(/*whatever*/); 

评估为int。因此,foo(/*whatever*/)可用于预期int的任何位置。例如int a = b + foo(/*whatever*/)

Simlarly float bar(/*whatever*/);评估为float,因此bar(/*whatever*/)可用于预期浮点数的任何位置。例如float a = b + bar(/*whatever*/)

返回void的函数,例如void foobar(/*whatever*/),评估为void,而不能用于某种类型的值(例如int,float,等)预计。

现在来代码。 main函数中的这一行有以下问题:

int main()
{
    Test2(Test(L"Hello", L"Testing")); /* Issue here */
    return 0;
} 

在这里,您将Test(L"Hello", L"Testing")作为参数传递给Test2。现在请记住,Test(/*whatever*/)评估为void因为Test返回空格。

所以你在那一行做的事情就像是

Test2(/*something that evaluates to a void*/);

但是,Test2取消void (*)(wchar_t*, wchar_t*)pointer to a function that returns void,与void不同。

所发生的事情是,编译器看到你在void所在的地方传递了void (*) (wchar_t*, wchar_t*),因此它正确地表明了错误。

在其他答案中可以提出不同的方法来解决这个问题。

答案 2 :(得分:0)

  

我是否需要使用C ++模板?

当然,您可以使用C ++模板执行此操作:

#include<utility>

// ...

template<typename F, typename... A>
void Test2(F &&f, A&&... a)
{
    std::forward<F>(f)(std::forward<A>(a)...);
    // ...
}

// ...

Test2(Test, L"Hello", L"Testing");

但你不需要他们做你想做的事 @πάνταῥεῖ已在其答案中解释了原因。