Я передаю указатель на функцию в качестве шаблона функции:станд :: 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)
, который является указателем на функцию. Почему он ведет себя так? Как я могу распознать функцию или указатель на функцию в этом случае?
Я ненавижу неявные преобразования :( –
* "(Как ни странно,' станд :: is_function <станд :: функция> == ложный ';-))« * - Возможно, для будущих стандартов «std :: is_callable» может быть хорошей идеей, поскольку 'std :: is_function' даже не работает для лямбда, просто простые функции (и времена, когда каждый вызываемый функция в современном C++). –
@ChristianRau 'std :: is_function' является одним из основных признаков классификации. 'is_callable', или что-то в этом роде будет полностью и совсем другой целью. –