gpt4 book ai didi

c++ - 为什么 std::is_function 对简单函数和 lambda 返回 false?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:27 26 4
gpt4 key购买 nike

有如下一段代码:

#include <iostream>
#include <type_traits>

template <typename F,
typename = typename std::enable_if<
std::is_function< F >::value
>::type>
int fun( F f ) // line 8
{
return f(3);
}

int l7(int x)
{
return x%7;
}

int main()
{
auto l = [](int x) -> int{
return x%7;
};
fun(l); // line 23
//fun(l7); this will also fail even though l7 is a regular function

std::cout << std::is_function<decltype(l7)>::value ; // prints 1
}

我会得到以下错误:

main2.cpp: In function ‘int main()’:
main2.cpp:23:8: error: no matching function for call to ‘fun(main()::<lambda(int)>&)’
fun(l);
^
main2.cpp:8:5: note: candidate: template<class F, class> int fun(F)
int fun( F f )
^
main2.cpp:8:5: note: template argument deduction/substitution failed:
main2.cpp:5:11: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
typename = typename std::enable_if<
^

当我注释掉 std::enable_if 模板参数时,它会正常编译和运行。为什么?

最佳答案

来自 cppreference :

Checks whether T is a function type. Types like std::function, lambdas, classes with overloaded operator() and pointers to functions don't count as function types.

This answer说明您还需要使用 std::remove_pointer<F>::type作为类型,因为函数在按值传递时被转换为指向函数的指针。所以你的代码应该是这样的:

template <typename F,
typename = typename std::enable_if<
std::is_function<
typename std::remove_pointer<F>::type
>::value
>::type>
int fun( F f )
{
return f(3);
}

关于c++ - 为什么 std::is_function 对简单函数和 lambda 返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com