C++ 中的"function Pointer"与 C# 中的"delegate"行为相似吗?
is "function Pointer" in c++ similar in behavior with "delegate" in c#?
我有一个小问题。
C++中的function Pointer
与C#中的delegate
在行为上相似吗?
是的,它们很相似。
但是C++中的函数指针不能指向类的实例方法,而C#中的委托可以。
.NET委托可以具有state,即可以创建对象实例方法的委托,并将this
保存在委托中:
Foo f;
BarDelegate d = f.Bar;
d(); // stores f as 'this' pointer.
当函数指针指向非成员函数时,其用法与委托相同。有人可以说,他们实际上比代表们更好,因为他们的重量更轻(不需要分配)。
但是,函数指针没有状态。这使得它们在与成员函数一起使用时大不相同——在调用函数指针时需要传入this
:
Foo f;
BarPtr p = &Foo::Bar;
(f.*p)(); // need to pass in 'this' pointer. ugly call syntax!
在C++中,我们也有"函子"——对象可以有状态,你可以像函数一样调用。在调用模板化函数时,这是委托最常用的替代方法。但函子只是一个类型概念,而不是实际类型:
struct BarFunctor
{
void operator()();
};
BarFunctor f;
f(); // not even a pointer, it's a full object and you're calling it.
对于.NET委托功能的精确复制,一个更合适的比较可能是C++的std::function
,它是一个可以用特定调用签名包装任何其他函子的函子。然而,std::function
并没有被大量使用,因为与委托一样,它们也有一些开销,模板通常会使这样一个重量级的对象变得不必要:
Foo f;
std::function<void()> func = [&] { f.Bar(); }; // the lambda object (a
func(); // functor) capturing a
// reference to f is
// stored into func (also
// a functor).
本质上是的,但委托要丰富得多。函数指针只是指向函数所在内存的指针。委托是一个将函数指针与其他信息一起封装的类。
因为C#中的所有东西基本上都是一个类,所以委托可以指向类上的方法。在C++中,这是一个真正的痛苦,因为C++函数使用特殊的调用约定来调用类方法,而函数指针本身不存储指向对象的指针(必须单独维护)。
委托也可以链接在一起,并且比C++函数指针具有更大的类型灵活性。请参阅委托中的协方差和方差
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 在图像中查找相似的(大)模式
- 句子与字符串向量中的每个句子的相似程度
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 在序列中查找相似的数字并记录最大连续连胜
- C 中的ValueChange事件相似功能
- 检查两个数组中的相似元素,为某些测试返回正确的值,为其他测试返回不正确的值
- 检查数组中的相似元素并传输到新数组
- 在向量中计算相似的整数
- 检查 2D 数组中的相似数字
- C++ 中的"function Pointer"与 C# 中的"delegate"行为相似吗?
- c#中的代码与c++中的代码相似
- 在一个非常大的序列中找到相似的子序列
- 找出向量中所有值之间的相似距离,并将其子集化
- 从不使用的 2 个向量(或列表)<algorithm>中删除相似元素