我已经达到了自学成才的一个方面,我并没有完全理解C#中delegate
的用途。另外,一时兴起,我决定看一下C ++网站的介绍,我遇到了function templates
。
也许我在这里比较苹果和橘子,但我理解delegate
是一种在运行时定义的函数的模板。这是真的?如果是这样,那么它与C ++中的函数模板有何不同?
是否可以看到每个正在使用的(实际)示例?
答案 0 :(得分:3)
委托是一种获取某个对象的成员函数,并创建一个可以独立调用的东西的方法。
换句话说,如果你有一些对象A,有一些成员函数F
,你通常称之为:A.F(1);
,委托就是你的一个实体can(例如)作为参数传递,它充当该对象/成员函数的代理,因此当调用委托时,它等同于调用该对象的成员函数。
它是一种获取现有代码的方式,并且......将其打包以便以相当具体的方式使用它(虽然我觉得有必要添加,但这种方式相当不错多才多艺,所以代表们非常有用。)
C ++函数模板是生成函数的一种方式。它指定要采取的一组操作,但不指定将在其上发生这些操作的特定对象类型。规范是在语法层面,所以(例如)我可以指定将两个东西放在一起以获得第三个项目的总和。如果我将其应用于数字,它总和就像你期望的那样。如果我对字符串执行相同的操作,它通常会连接字符串。这是因为(语法上)模板只是指定a+b
之类的东西,但+
被定义为添加数字和字符串连接。
稍微不同的是,函数模板只是为某些代码指定了骨架。该代码的其余部分是"填写"基于类型,当您通过某种特定类型实例化模板时。
答案 1 :(得分:2)
在C ++术语中,C#委托将对象指针和成员函数指针组合成一个可调用实体,该实体调用指向对象的成员函数。
您可以对std::bind
和std::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 ) );
}