C++服软C#系列 —— std::function

用过C#的人,一般都知道委托和事件。
如果没有用过C#,我在这里简单解释一下委托,如果用过了,下面可以skip。

委托是一个方法声明,我们知道,在C语言中,可以通过函数指针表示一个地址的CALL方法,委托在C#中也差不多是干这样的工作。
但是委托有一些不同,主要的地方就是,在C++中, 函数指针并不是“面向对象”的,比如,我们有一个类CTest,类中有一个成员方法foo,此时如果我们要通过函数指针的方式来调用foo的话,因为foo是类CTest的成员,我们需要CTest的实例this指针。

比方说:
class CTest
{
    public:
        void foo(int i) {}
};
它的成员函数指针应该这样写:
void (CTest::*FuncFoo)(int);
如果这个成员是const修饰的,则这样:
void (CTest::*FuncFoo)(int) const;

调用怎么办呢?这样:
CTest* pThis = new...;
FuncFoo pThis_foo = &CTest::foo;
(pThis->*pThis_foo)(123);
如果你这样写:
pThis->*pThis_foo(123);
是会出问题的,因为->*这个运算符的优先级很低。。。。

如果CTest不是在HEAP上的,是在stack上的呢?
这样:
CTest pThis;
(pThis.*pThis_foo)(123);

这些奇葩的语法,->*、.*这种神奇的运算符真是蛋疼。
而有时候我们又无法逃避,比如启动线程的时候,我们一般从一个static函数通过这种sb的语法,把类this当作参数传过去,然后跑过去类的成员函数。

但是在C#中, 委托则是面向对象的,你可以用委托表示一个类实例的成员函数指针。
比如:
namespace ConsoleApplication1
{
    public delegate void CallbackFunc(int i);
    //void (callback*)(int i);

    class CNewTest
    {
        private static readonly string _str = "this CNewTest.";

        public void MemberCallback(int i)
        {
            System.Diagnostics.Debug.WriteLine(i.ToString());
            System.Diagnostics.Debug.WriteLine(_str);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值