hexx 2024-03-10 14:55 采纳率: 0%
浏览 1

在 C++ Builder XE8 中怎样使用 Delphi 的匿名过程?

Delphi 是通过接口的一个 Invoke(…) 函数来实现匿名函数的,举例:

interface

type
TFilterPredicate = reference to function(const Path: string;const SearchRec: TSearchRec): Boolean;
// ...
class function GetFiles(const Path: string;
const Predicate: TFilterPredicate): TStringDynArray;overload; inline; static;

C++ Builder 对应写为:

typedef System::DelphiInterface<TFilterPredicate> _di_TFilterPredicate;
__interface TFilterPredicate : public System::IInterface 
{
virtual bool __fastcall Invoke(const System::UnicodeString Path, const System::Sysutils::TSearchRec &SearchRec) = 0 ;
};
// .. 
static System::TStringDynArray __fastcall GetFiles(const System::UnicodeString Path, const _di_TFilterPredicate Predicate)/* overload */;

现在的问题是:在C++ Builder XE8 里怎样使用 _di_TFilterPredicate ?
(备注:C++ Builder XE8不支持 Lamda 表达式)

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-10 14:55
    关注

    引自免费微信小程序:皆我百晓生

    在 C++ Builder XE8 中,由于不支持 Lambda 表达式,你需要通过实现一个匿名函数类(Functor)的方式来模拟 Delphi 中的匿名过程。下面是一个示例来说明如何创建和使用 _di_TFilterPredicate 接口:

    class TCppFilterPredicate : public TInterfacedObject, public _di_TFilterPredicate
    {
    public:
      TCppFilterPredicate(std::function<bool(const System::UnicodeString, const System::Sysutils::TSearchRec&)> Predicate)
        : FPredicate(Predicate) {}
    
      // 实现 Invoke 函数
      virtual bool __fastcall Invoke(const System::UnicodeString Path, const System::Sysutils::TSearchRec &SearchRec) override
      {
        return FPredicate(Path, SearchRec);
      }
    
    private:
      std::function<bool(const System::UnicodeString, const System::Sysutils::TSearchRec&)> FPredicate;
    };
    
    // 使用方式
    void UseAnonymousFunction()
    {
      // 创建一个符合接口要求的匿名函数对象
      auto MyPredicate = [](const System::UnicodeString Path, const System::Sysutils::TSearchRec &SearchRec) -> bool
      {
        // 在这里编写你的逻辑
        return Path.Pos("*.txt") != -1; // 仅筛选扩展名为 .txt 的文件
      };
    
      // 将匿名函数封装到接口对象中
      _di_TFilterPredicate FilterPredicate = new TCppFilterPredicate(MyPredicate);
    
      // 调用 GetFiles 函数
      System::TStringDynArray Files = GetFiles("C:\\MyPath", FilterPredicate);
      
      // ... 后续处理 Files 数组 ...
    }
    
    

    这段代码首先定义了一个名为 TCppFilterPredicate 的类,它继承自 TInterfacedObject_di_TFilterPredicate,并在其中实现了 Invoke 函数。然后,我们创建了一个临时的 C++ 标准库中的 std::function 对象,用于存储我们的匿名函数逻辑。

    接下来,我们将这个标准库的匿名函数包装到了 TCppFilterPredicate 类的一个实例中,并将此实例转换为 _di_TFilterPredicate 接口类型,从而可以作为参数传递给 GetFiles 函数。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向