C ++模板中的函数签名

Con*_*uit 3 c++ templates c++11

std::function类模板以这样的方式,当我们希望它包裹类似下面的功能:

void printInt(int integer)
{
    std::cout << int << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我们使用std::function<void(int)>。直到最近,我还以为这是该类的一个细微差别,但是在C ++中搜索委托实现时发现的一个类使用了类似的语法。

到底 void(int)什么,我们用技术术语称之为什么?这似乎是在codepeak 中说“ 带一个int并返回void的函数 ”的标准方法,但是我的直觉告诉我,这简直太过简单了。

其次,我注意到当我看到使用此语法的模板时,它们使用可变参数模板来匹配多个功能签名。从上面的链接:

template <typename T> class delegate;

template<class R, class ...A>
class delegate<R (A...)>
{
...
Run Code Online (Sandbox Code Playgroud)

为什么要声明这样的功能而不是简单地使用以下内容?

template<class R, class ...A>
class delegate
{
...
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 5

模板参数to std::function<Signature>只是函数的类型,即其签名。它使用与任何函数声明相同的符号,只是未命名且名称被忽略。您可能遇到过使用相同符号的函数指针,但是函数签名用于指针。

使用模板专门化实现的原因std::function<Signature>(显然是delegate<Signature>)是为了产生更好的类型:

template <typename T> class function;
template <typename R, typename... Args>
class function {
public:
    R operator()(Args...);
    // ...
};

template <typename R, typename... Args>
class other {
public:
    R operator()(Args...);
    // ...
};

int main() {
    function<int(double, char)> f;
    other<int, double, char>    o;
}
Run Code Online (Sandbox Code Playgroud)

由于的主要模板function<T>采用一种类型作为参数,因此使用专门化,参数可以是普通的函数类型。另一方面,没有这样做other<T...>,因此无法获得类型列表。

值得一没有什么std::function<T>对象可以被周围很容易,而不需要处理许多模板参数传递:因为函数的签名只是一个类型,这个类模板只需一个模板参数。