2016-07-05 268 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"); 

但你並不需要他們做什麼你正在嘗試做的。
@πάνταῥεῖ已經解釋了爲什麼在它的答案。