关于c ++:将参数传递给函数指针


Passing parameters to function pointer

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

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}

我得到这个错误:

argument of type"void" is incompatible with parameter of type"void (*)(wchar_t *, wchar_t *)"

我如何解决这个问题来完成我正在努力实现的目标?

编辑:很抱歉不清楚。我真正要做的是向子进程中注入一个函数,并传递两个参数(wchar_t*,wchar_t*),以便使用它们。但是主函数可以是void或int argc、char**argv。因此,我只需使用全局变量就可以实现我想要实现的目标。


你可能想吃点什么

1
2
3
4
5
6
7
8
9
10
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?

我能想到

1
2
3
4
5
6
7
8
9
10
11
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;
}

这应该很有效。


Do I need to use C++ templates?

当然,您可以使用如下C++模板来实现这一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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");

但你不需要他们做你想做的事。@π?ε?ε?已经在答案中解释了原因。


有多种方法可以解决TIH问题,不过,让我试着说明发生此错误的原因。

每个函数都有一个与之相关联的值类型。这意味着,每个函数的计算结果都是某种类型的值。这由它的返回值表示。

例如:

1
int foo(/*whatever*/);

计算为整数,因此foo(/*whatever*/)可用于预期int的任何地方。例如,像int a = b + foo(/*whatever*/)

同时,float bar(/*whatever*/);的计算结果为float,因此,bar(/*whatever*/)可以在任何期望浮动的地方使用。例如,像float a = b + bar(/*whatever*/)

一种返回void的函数,与void foobar(/*whatever*/)类似,但其计算结果是void的值,在需要某种类型的值(如int、float等)时不能使用。

现在开始编码。您的main函数中的这一行存在以下问题:

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

在这里,你把Test(L"Hello", L"Testing")作为论点传给Test2。现在记住,Test(/*whatever*/)评估为void,因为Test返回一个空值。

所以你在那条线上做的是

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

但是,Test2预期void (*)(wchar_t*, wchar_t*)pointer to a function that returns voidvoid不同。

所以,现在发生的情况是,编译器看到您正在传递一个void,在一个需要void (*) (wchar_t*, wchar_t*)的地方,所以它正确地指示了这个错误。

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