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

Jur*_*aho 11 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.
}
Run Code Online (Sandbox Code Playgroud)

但模板参数F不被识别is_function为函数,静态断言失败.编译器错误消息说,F就是int(*)(int)这是一个函数指针.为什么它表现得那样?在这种情况下,如何识别功能或指针?

Kon*_*lph 15

F是一个函数指针(无论您是否通过f&f).所以删除指针:

std::is_function<typename std::remove_pointer<F>::type>::value
Run Code Online (Sandbox Code Playgroud)

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

  • *"(具有讽刺意味的是,`std :: is_function <std :: function <FT >> == false` ;-))"* - 也许对于未来的标准,`std :: is_callable`可能是一个好主意,因为`std :: is_function`甚至不适用于lambdas,只是简单的函数(并且每个可调用的函数都是现代C++中的函数). (5认同)
  • 我讨厌隐含的转换:( (2认同)