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

时间:2013-01-27 18:54:03

标签: templates functional-programming metaprogramming

作为编程练习,我决定尝试为我正在用c ++编写的课程实现我所有的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 (&)())’

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

1 个答案:

答案 0 :(得分:1)

我认为'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);
}