C++ 接受任何函数(但仅函数)作为参数

C++ 接受任何函数(但仅函数)作为参数,c++,C++,有没有办法接受任何函数签名作为参数?例如: void accepter(void (*func)(int)) { ... } 将接受任何类型的void(*)(int)。我知道我可以使用模板,例如: template<class T> void accepter(T func) { ... } 模板 无效接受体(T func){…} 这会起作用,但它允许传入非函数。如何仅对函数进行过滤,就像void*对任何类型的指针进行过滤一样?使用C++11的std::function应该可

有没有办法接受任何函数签名作为参数?例如:

void accepter(void (*func)(int)) {  ... }
将接受任何类型的
void(*)(int)
。我知道我可以使用模板,例如:

template<class T>
void accepter(T func) { ... }
模板
无效接受体(T func){…}

这会起作用,但它允许传入非函数。如何仅对函数进行过滤,就像
void*
对任何类型的指针进行过滤一样?

使用C++11的
std::function
应该可以工作:

#include <functional>

template<typename T>
void test (std::function<T> func) {    
#包括
模板
无效测试(std::function func){
您可以使用此选项,例如:

int foo (int);
std::sting bar (bool);

test(std::function<int(int)>(foo));
test(std::function<std::string(bool)>(bar));
intfoo(int);
标准:尾杆(bool);
测试(标准:功能(foo));
测试(标准:功能(棒));

如果您尝试调用它,将出现编译时错误。您在做什么,会出现链接时错误?我看到的唯一方法是,如果您只显式地为函数类型实例化模板,但您似乎没有这样做……获取函数的地址(jit编译器)这仍然不会导致链接时间错误。是的,我想这是真的。我将编辑我的问题。使用C++11 std::function或boost::function,例如,
std::function
没有隐式转换。不过这是可行的!