函数模板和委托的区别是什么?

What is the difference between a Function Template and a Delegate?

本文关键字:区别 是什么 函数模板      更新时间:2023-10-16

在我自学的学习中,我已经到达了一个点,我没有完全掌握c#中的delegate是有用的。另外,一时兴起,我决定去看看一个介绍c++的网站,我遇到了function templates

也许我在这里比较苹果和橘子,但我理解delegate是一种模板的函数,将在运行时定义。这是真的吗?如果是这样,它与c++中的函数模板有什么不同?

是否有可能看到(现实的)使用中的每个例子?

委托是一种获取某些对象的成员函数并创建…可以独立调用的东西

换句话说,如果你有一些对象A,有一些成员函数F,你通常会像这样调用:A.F(1);,一个委托是一个单独的实体,你可以(例如)作为一个参数传递,它作为对象/成员函数的代理,所以当委托被调用时,它相当于调用该对象的成员函数。

这是一种获取现有代码的方法,并且…将其打包以使其更容易以一种相当特定的方式使用(尽管我觉得有必要补充,这种"方式"是非常通用的,因此委托可能非常有用)。

c++函数模板是一种生成函数的方法。它指定了一些要执行的操作集,但没有指定这些操作将在其上发生的特定类型的对象。规范是在语法级别上的,因此(例如)我可以指定将两项相加得到第三项,即它们的和。如果我把它应用到数字上,它和你期望的一样。如果我对字符串做同样的操作,它通常会将字符串连接起来。这是因为(语法上)模板只指定了a+b之类的东西,但+被定义为执行数字的加法和字符串的连接。 从稍微不同的角度来看,函数模板只是指定了一些代码的框架。当您在某些特定类型上实例化模板时,该代码体的其余部分将根据类型"填充"。

在c++术语中,c#委托将对象指针和成员函数指针组合成一个可调用实体,该实体在指向的对象上调用成员函数。

您可以对std::bindstd::function执行相同的操作。

在c++ 11之前,有一大堆关于如何在c++中实现高效委托的文章。std::function是一个非常合理的折衷方案,甚至可以达到这些效率水平。


的例子:

#include <iostream>
#include <functional>
using namespace std;
// Here `function<void()>` serves as a "delegate" type.
void callback_on( function<void()> const f )
{
    f();
}
struct S
{
    int x;
    void foo() const { cout << x << endl; }
};
int main()
{
    S o = {42};
    callback_on( bind( &S::foo, &o ) );
}