Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::函数和函数模板_C++_Templates_Std Function - Fatal编程技术网

C++ 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

我想给std::函数分配一个通过函数模板定义的函数,但是我得到了未解决的重载函数类型错误

//模板
模板
双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),允许的参数类型列表以左值引用类型(对象或函数)开头;
,甚至在您的子列表之前。指针与此处的引用没有什么不同。@bipll
poly
不是
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;
}