2013-05-06 2 views
9

Я передаю указатель на функцию в качестве шаблона функции:станд :: is_function не признает аргумент шаблона как функция

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), который является указателем на функцию. Почему он ведет себя так? Как я могу распознать функцию или указатель на функцию в этом случае?

ответ

12

Fявляется указателем на функцию (независимо от того, проходите ли вы f или &f). Так удалить указатель:

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

(Как ни странно, std::is_function<std::function<FT>> == false ;-))

+2

Я ненавижу неявные преобразования :( –

+5

* "(Как ни странно,' станд :: is_function <станд :: функция > == ложный ';-))« * - Возможно, для будущих стандартов «std :: is_callable» может быть хорошей идеей, поскольку 'std :: is_function' даже не работает для лямбда, просто простые функции (и времена, когда каждый вызываемый функция в современном C++). –

+0

@ChristianRau 'std :: is_function' является одним из основных признаков классификации. 'is_callable', или что-то в этом роде будет полностью и совсем другой целью. –

Смежные вопросы