C++ std::函数和函数模板
我想给std::函数分配一个通过函数模板定义的函数,但是我得到了未解决的重载函数类型错误C++ std::函数和函数模板,c++,templates,std-function,C++,Templates,Std Function,我想给std::函数分配一个通过函数模板定义的函数,但是我得到了未解决的重载函数类型错误 //模板 模板 双iter(双x) { 对于(int j=0;j poly不是一个std::function。它是一个普通的、花园式的函数。您可以使用普通函数指针来构造兼容的std::function,但这不是构造对象的实例。我们在这里使用的是模板参数,这不是同一回事 您只需将可调用对象作为参数传递给iter(),而不用使用模板参数。如下所示: #include <functional> #in
//模板
模板
双iter(双x)
{
对于(int j=0;j
poly
不是一个std::function
。它是一个普通的、花园式的函数。您可以使用普通函数指针来构造兼容的std::function
,但这不是构造对象的实例。我们在这里使用的是模板参数,这不是同一回事
您只需将可调用对象作为参数传递给iter()
,而不用使用模板参数。如下所示:
#include <functional>
#include <cmath>
#include <iostream>
template<int i>
double iter(const std::function<double(double)> &f, double x)
{
for (int j=0; j<i; j++)
{
x=f(x);
}
return x;
}
// function
double poly(double x)
{
return pow(x,2)-2;
}
int main()
{
std::function<double(double)> f=
[]
(double v)
{
return iter<2>(poly, v);
};
std::cout << f(1.0) <<std::endl;
return 0;
}
#包括
#包括
#包括
模板
双iter(常数标准::函数&f,双x)
{
对于C++20之前的(int j=0;j),模板参数的唯一允许类型为:
- std::nullptr_t(从C++11开始)
- 整体式
- 指针类型(指向对象或函数)
- 指向成员类型(成员对象或成员函数)的指针
- 枚举类型
因为std::function&
不是这些,所以不能在模板参数中使用它
但是,您可以使用指向具有外部链接的函数的指针,如下所示:
#包括
#包括
#包括
//模板
模板
双iter(双x)
{
对于(int j=0;jOn),允许的参数类型列表以左值引用类型(对象或函数)开头;
,甚至在您的子列表之前。指针与此处的引用没有什么不同。@bipllpoly
不是lvalue
@OlafDietsche当然,它的类型也不是std::function
。因此,虽然普通函数到std::function的转换在运行时是隐式的,但在编译时却不是这样sion是在运行时完成的,但它是有效的编译时转换,这就是它编译的原因。模板实例的参数没有等效的编译时转换。
iter<poly, 2>;
#include <functional>
#include <cmath>
#include <iostream>
template<int i>
double iter(const std::function<double(double)> &f, double x)
{
for (int j=0; j<i; j++)
{
x=f(x);
}
return x;
}
// function
double poly(double x)
{
return pow(x,2)-2;
}
int main()
{
std::function<double(double)> f=
[]
(double v)
{
return iter<2>(poly, v);
};
std::cout << f(1.0) <<std::endl;
return 0;
}