我将函数指针传递给函数模板:
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
识别为函数,静态断言失败。编译器错误消息表明F
是int(*)(int)
,它是函数的指针。为什么它表现得那样?在这种情况下,如何识别函数或指针?
答案 0 :(得分:15)
F
是指向函数的指针(无论您是否通过f
或&f
)。所以删除指针:
std::is_function<typename std::remove_pointer<F>::type>::value
(具有讽刺意味的是,std::is_function<std::function<FT>> == false
; - ))