我有以下代碼來演示一個函式在另一個函式中被呼叫。
下面的代碼可以正常作業:
#include <iostream>
int thirds()
{
return 6 1;
}
template <typename T, typename B>
int hello(T x, B y , int (*ptr)() ){
int first = x 1;
int second = y 1;
int third = (*ptr) (); ;
return first second third;
}
int add(){
int (*ptr)() = &thirds;
return hello(1,1, thirds);
}
int main()
{
std::cout<<add();
return 0;
}
現在我想將一個數字作為引數從添加函式傳遞到三分之二函式(三分之二(6))。
我正在嘗試這種方式:
#include <iostream>
int thirds(int a){
return a 1;
}
template <typename T, typename B>
int hello(T x, B y , int (*ptr)(int a)() ){
int first = x 1;
int second = y 1;
int third = (*ptr)(a) (); ;
return first second third;
}
int add(){
int (*ptr)() = &thirds;
return hello(1,1, thirds(6)); //from here pass a number
}
int main()
{
std::cout<<add();
return 0;
}
我的預期輸出是:
11
但它不起作用。請有人可以告訴我我做錯了什么嗎?
uj5u.com熱心網友回復:
- 如果要將
add值傳遞給hello, 以傳遞給指標給定的函式ptr,則必須添加單獨的引數。 - 在 c 中,通常建議使用
std::function而不是舊的 c 樣式函式指標。
一個完整的例子:
#include <iostream>
#include <functional>
int thirds(int a)
{
return a 1;
}
template <typename T, typename B>
//------------------------------------------------VVVVV-
int hello(T x, B y, std::function<int(int)> func, int a)
{
int first = x 1;
int second = y 1;
int third = func(a);
return first second third;
}
int add()
{
std::function<int(int)> myfunc = thirds;
return hello(1, 1, myfunc, 6);
}
int main()
{
std::cout << add();
return 0;
}
輸出:
11
注意:另一種解決方案可能是用于std::bind創建可呼叫的 fromthirds和引數6。但我認為上面的解決方案更簡單直接。
uj5u.com熱心網友回復:
thirds(6)
產生一個 prvalue 型別int。這不能轉換為函式指標。您需要6作為單獨的引數傳遞。
注意:這里 C 的美妙之處在于,您實際上不需要知道要傳遞的內容,只要您愿意使用指定為模板引數的型別的引數即可。您甚至不需要限制函式可以使用的引數數量。而且你甚至不需要關心函式指標語法......
int thirds(int a) {
return a 1;
}
long f(std::string const& x, int y)
{
return x.size() y;
}
template <typename T, typename B, class Function, class ... Args>
auto hello(T x, B y, Function f, Args...args) // deduce the return type
{
int first = x 1;
int second = y 1;
int third = f(args...);
return first second third;
}
int main()
{
std::cout
<< hello(1, 2, thirds, 6) << '\n'
<< hello(1, 2, f, "hello world", 8) << '\n'
<< hello(1, 2, []() {return 3; }) << '\n'
;
return 0;
}
順便說一句:在實踐中,您可能應該使用完美轉發,但我在上面的代碼中省略了這一點,使其對初學者更加友好。
這是我在實踐中實作的功能版本:
template <typename T, typename B, class Function, class ... Args>
decltype(auto) hello(T&& x, B&& y, Function&& f, Args&&...args)
{
return (std::forward<T>(x) 1)
(std::forward<B>(y) 1)
std::forward<Function>(f)(std::forward<Args>(args)...);
}
uj5u.com熱心網友回復:
您發布的代碼似乎無法編譯。您是否嘗試過類似以下的方法?
#include <stdio.h>
#include <iostream>
int thirds(int a){
return a 1;
}
template <typename T, typename B>
int hello(T x, B y , int (*ptr)(int)){
int first = x 1;
int second = y 1;
int third = ptr(first);
return first second third;
}
int add(){
int (*ptr)(int) = &thirds;
return hello(1, 1, ptr); //from here pass a number
}
int main()
{
std::cout << add();
return 0;
}
此外,我建議研究std::function和lambdas。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532028.html
上一篇:串列未在Python的函式中定義
