std :: is_function无法将模板参数识别为函数

时间:2013-05-06 08:52:07

标签: c++ types c++11

我将函数指针传递给函数模板:

int f(int a) { return a+1; }

template<typename F>
void use(F f) {
    static_assert(std::is_function<F>::value, "Function required"); 
}

int main() {
    use(&f); // Plain f does not work either.
}

F无法将模板参数is_function识别为函数,静态断言失败。编译器错误消息表明Fint(*)(int),它是函数的指针。为什么它表现得那样?在这种情况下,如何识别函数或指针?

1 个答案:

答案 0 :(得分:15)

F是指向函数的指针(无论您是否通过f&f)。所以删除指针:

std::is_function<typename std::remove_pointer<F>::type>::value

(具有讽刺意味的是,std::is_function<std::function<FT>> == false; - ))