功能模板和代理之间有什么区别?

时间:2014-08-11 14:35:33

标签: c# c++

我已经达到了自学成才的一个方面,我并没有完全理解C#中delegate的用途。另外,一时兴起,我决定看一下C ++网站的介绍,我遇到了function templates

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

是否可以看到每个正在使用的(实际)示例?

2 个答案:

答案 0 :(得分:3)

委托是一种获取某个对象的成员函数,并创建一个可以独立调用的东西的方法。

换句话说,如果你有一些对象A,有一些成员函数F,你通常称之为:A.F(1);,委托就是你的一个实体can(例如)作为参数传递,它充当该对象/成员函数的代理,因此当调用委托时,它等同于调用该对象的成员函数。

它是一种获取现有代码的方式,并且......将其打包以便以相当具体的方式使用它(虽然我觉得有必要添加,但这种方式相当不错多才多艺,所以代表们非常有用。)

C ++函数模板是生成函数的一种方式。它指定要采取的一组操作,但不指定将在其上发生这些操作的特定对象类型。规范是在语法层面,所以(例如)我可以指定将两个东西放在一起以获得第三个项目的总和。如果我将其应用于数字,它总和就像你期望的那样。如果我对字符串执行相同的操作,它通常会连接字符串。这是因为(语法上)模板只是指定a+b之类的东西,但+被定义为添加数字和字符串连接。

稍微不同的是,函数模板只是为某些代码指定了骨架。该代码的其余部分是"填写"基于类型,当您通过某种特定类型实例化模板时。

答案 1 :(得分:2)

在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 ) );
}