2016-07-05 264 views
1

我想将参数传递给作为参数传递的函数指针。将参数传递给函数指针

代码:

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; 
} 

我收到此错误:

​​

如何解决这个问题,以完成我想要达到什么目的?

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

+0

根据你想要做什么,lambda可能就足够了。 – chris

+2

你试图达到的是什么?正如你所看到的,你的代码是无效的C,所以它不是你的意图的有用证明。 –

+0

πάνταῥεῖ的答案是我想要达到的目标,但我希望有一种不同的方式来做到这一点,比如在C++中使用模板 – user1304765

回答

4

你可能想有类似

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; 
} 

,而不是实现。


至于您的评论

How do i do this in C++ with templates?

我能想到的

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; 
} 

这应该只是正常工作。

+0

您的答案就是我想要实现的。我如何在C++中使用模板来做到这一点? – user1304765

+0

@ user1304765更新了我的答案。仍然不确定你真正想要什么。 –

+0

是的,它实际上有点复杂。我有一个函数将代码(函数)注入到子进程中,因此它具有此参数:int(* Main)(wchar_t *,wchar_t *)。我传递给它的Main函数调用一个带有两个wchar_t *的函数。 – user1304765

0

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

每个函数都有一个与其相关的值类型。这意味着,每个函数都会评估某种类型的值。这由其返回值来表示。

例如:

int foo(/*whatever*/); 

的计算结果为一个int。所以foo(/*whatever*/)可用于任何地方int预计。例如像int a = b + foo(/*whatever*/)

Simlarly float bar(/*whatever*/);的计算结果为float,因此bar(/*whatever*/)可用于预计浮标的任何位置。例如像float a = b + bar(/*whatever*/)

然而返回voidvoid foobar(/*whatever*/)的函数,计算结果为void不能使用其中某些类型的(比如整数,浮点等等)的一个值预期。

现在来代码。这条线在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 expectes一个void (*)(wchar_t*, wchar_t*),这是一个pointer to a function that returns void,这是从void不同。

所以发生了什么事情是,编译器看到你正在传递一个void在一个void (*) (wchar_t*, wchar_t*)的地方,所以它正确地指出了错误。

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

0

Do I need to use C++ templates?

当然,你也可以做,使用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"); 

但你并不需要他们做什么你正在尝试做的。
@πάνταῥεῖ已经解释了为什么在它的答案。