Skip to content

Mzying2001/cppsharp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cppsharp

给 C++ 引入类似 C# 的委托(Delegate)和属性(Property)支持。

该头文件为 C++ 提供类似 C# 的委托机制。

示例

以下定义了一个 Button 类,使用委托定义一个 Clicked 事件,通过 Click 函数模拟一次按钮点击。ActionDelegate<void(Args...)> 的类型别名,表示无返回值的委托,此外还可以使用 Func 表示有返回值的委托,两者的模板参数与 C# 中的 ActionFunc 保持一致。

class Button
{
public:
    // 点击事件
    Action<Button *> Clicked;

    // 模拟点击按钮
    void Click()
    {
        if (Clicked) {
            Clicked(this);
        }
    }
};

测试代码如下:

void ClickedHandler(Button *b)
{
    std::cout << "Button clicked!" << std::endl;
}

int main()
{
    Button btn;

    // 绑定事件处理函数
    btn.Clicked += ClickedHandler;

    // 支持多播,这里添加一个lambda处理函数
    // 委托支持任意可调用对象,包括函数指针、成员函数(通过Add方法)、lambda表达式等
    btn.Clicked += [](Button *b) {
        std::cout << "Lambda: Button clicked!" << std::endl;
    };

    // 模拟点击按钮,触发事件
    btn.Click();

    // 通过-=操作符移除事件处理函数
    btn.Clicked -= ClickedHandler;

    // 再次点击按钮
    btn.Click();

    return 0;
}

运行结果:

Button clicked!
Lambda: Button clicked!
Lambda: Button clicked!

该头文件为 C++ 提供类似 C# 的属性语法。

示例

以下定义了一个 Person 类,包含一个可读可写属性 Age 以及一个只读属性 AgeStr,代码演示了属性的声明和初始化。

class Person
{
    // 属性Age维护的字段
    int _age;

public:
    // 声明一个属性Age
    Property<int> Age;

    // 声明AgeStr只读属性,表示Age的字符串
    ReadOnlyProperty<string> AgeStr;

    // 构造函数
    Person()
        : Age(Property<int>::Init(this)
                  // 使用Property<int>::Init初始化属性
                  .Getter([](Person *self) {
                      cout << "get Age" << endl;
                      return self->_age;
                  })
                  .Setter([](Person *self, const int &value) {
                      cout << "set Age: " << value << endl;
                      if (value <= 0) {
                          cout << "error: Age can not smaller than 1" << endl;
                          return; // 若设置的Age范围不正确则输出错误,不更改值
                      }
                      self->_age = value;
                  })),

          AgeStr(Property<string>::Init(this)
                     .Getter([](Person *self) {
                         cout << "get AgeStr" << endl;
                         return to_string(self->_age);
                     }))
    {
        _age = 1; // Age默认值
    }
};

测试代码如下:

int main()
{
    Person p;
    cout << p.Age << endl; // get Age

    p.Age = -1;            // error: Age can not smaller than 1
    cout << p.Age << endl; // 仍然为1

    p.Age = 10;
    cout << p.AgeStr << endl; // 10

    Person p2 = p;                      // 对象可以正常拷贝
    p2.Age++;                           // 先get后set
    cout << p2.AgeStr->c_str() << endl; // 使用->可以访问属性成员

    return 0;
}

运行结果:

get Age
1
set Age: -1
error: Age can not smaller than 1
get Age
1
set Age: 10
get AgeStr
10
get Age
set Age: 11
get AgeStr
11

About

给 C++ 引入类似 C# 的委托(Delegate)和属性(Property)支持。

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages