Templates C++;类似函数的模板语法

Templates C++;类似函数的模板语法,templates,c++11,syntax,variadic-templates,std-function,Templates,C++11,Syntax,Variadic Templates,Std Function,在C++11中,您可以像这样实例化std::函数: std::function<void(int)> f1; std::function<int(std::string, std::string)> f2; //and so on int foo(char a, double b) template <class T> struct function; // not defined template <class R, class... A>

在C++11中,您可以像这样实例化std::函数:

std::function<void(int)> f1;
std::function<int(std::string, std::string)> f2;
//and so on
int foo(char a, double b)
template <class T>
struct function; // not defined

template <class R, class... A>
struct function<R (A...)>
{
  // definition here
};
std::函数f1;
std::功能f2;
//等等
但是,虽然网上有很多关于可变模板的信息,但我找不到任何关于如何编写std::function-like模板的文章,该模板可以接受括号内的参数。
有谁能解释一下语法及其局限性,或者至少指出一个现有的解释吗?

它没有什么特别之处,它是一种普通的函数类型。当您声明这样的函数时:

std::function<void(int)> f1;
std::function<int(std::string, std::string)> f2;
//and so on
int foo(char a, double b)
template <class T>
struct function; // not defined

template <class R, class... A>
struct function<R (A...)>
{
  // definition here
};
然后它的类型是
int(char,double)
。“展开”单个参数类型和返回类型的一种方法是使用部分模板专门化。基本上,
std::function
看起来像这样:

std::function<void(int)> f1;
std::function<int(std::string, std::string)> f2;
//and so on
int foo(char a, double b)
template <class T>
struct function; // not defined

template <class R, class... A>
struct function<R (A...)>
{
  // definition here
};
模板
结构函数;//未定义
模板
结构函数
{
//这里的定义
};

非常类似于任何其他模板,因为
int(std::string,std::string)
只是一种类型

下面是一个非常简单的示例,它编译:

template <typename FType>
struct Functor
{
   Functor(FType* fptr) : fptr(fptr) {}

   template <typename ...Args>
   void call(Args... args)
   {
      fptr(args...);
   }

private:
   FType* fptr;
};

void foo(int x, char y, bool z) {}

int main()
{
   Functor<void(int, char, bool)> f(&foo);
   f.call(1, 'a', true);
   //f.call(); // error: too few arguments to function
}
模板
结构函子
{
函子(FType*fptr):fptr(fptr){}
模板
无效调用(Args…Args)
{
fptr(args…);
}
私人:
FType*fptr;
};
voidfoo(intx,chary,boolz){}
int main()
{
函子f(&foo);
f、 调用(1,'a',true);
//f、 call();//错误:参数太少,无法运行
}

事实上,你会对
FType
成为
ReturnType(ArgTypes…
)有一个专门的了解,尽管我的简单示例已经为你提供了以兼容方式调用它所需的验证。

因此,如果我理解正确,int(char,double)被解释为一个函数类型,但是我们可以通过部分专门化提取返回类型和参数列表?@Cynic是的,这就是它的工作原理。我对答案进行了相应的编辑。我需要像
template void foo(F(int)intCallable){…}
:/@MariuszJaskó322ka这样的语法是
foo(F intCallable(int))
。它与任何其他函数语法一样:名称位于返回类型和参数列表之间。