gpt4 book ai didi

templates - 如何使用 C++ 模板传递函数及其签名(haskell 样式)?

转载 作者:行者123 更新时间:2023-12-02 22:25:18 24 4
gpt4 key购买 nike

作为一项编程练习,我决定尝试为我正在用 C++ 进行的类(class)实现所有 Haskell 作业。目前,我正在尝试发送此函数:

int callme(){
cout << "callme called" << endl;
return 0;
}

此函数:

template<class type1,class type2> void callfunc(type1(*f)(type2)){
(*f)();
}

通过此调用:

int main(){
callfunc<int,void>(callme);
}

但我收到错误:

macros.cc: In function ‘int main()’:
macros.cc:45:29: error: no matching function for call to ‘callfunc(int (&)())’

什么给了?我能够以完全相同的方式发送函数作为参数,只是没有模板...唯一应该更改的是在编译之前将类型名称替换到正确的位置,不是吗?

最佳答案

我认为“void”是 C++ 中的“特殊情况”。编译器无法将 f() 与 f(void) 匹配将其替换为任何其他类型,它将编译。对我来说,这只是另一个 C++ 魔法,但也许有人更了解。这将编译:

int callme(int){ printf("ok int\n"); return 0; }
int callme(char){ printf("ok char\n"); return 0; }
template<class type1,class type2> void callfunc(type1(*f)(type2), type2 p) {
(*f)(p);
}

int main() {
callfunc<int,int>(callme, 1);
callfunc<int,char>(callme, 1);
}

关于templates - 如何使用 C++ 模板传递函数及其签名(haskell 样式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14550927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com