C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[75430] Re:TList의 람다식 검색
빌더(TWx) [builder] 2851 읽음    2019-05-28 09:18
배트맨 님이 쓰신 글 :
: 최근에 C#을 C++로 변환하는 프로젝트를 진행중입니다.
:
: 혹시 C#에서의 Lambda 식 유사한 지원이 가능할 까요?
:
: 예를 들면 C#에서는
: return A.Find(x => X.Name == "AA");
:
: 이렇게 하면 멤버가 가지고 있는 이름과 일치하는 항목을 리턴합니다.
:
: 이런 것을 TList를 사용해서 구현하려고 하는데..
:
: for (int i=0; i<List->Count; i++)
: {
:    if (List->Items[i]->Name == "AA")
:      return List->Items[i];
: }
: return NULL;
:
: 검색을 위해서는 이런 형식의 for 문을 돌려야만 하나요?
:
:



답변:


TList는 C++ 클래스가 아니고 델파이 파스칼 언어로 만들어 놓은 클래스에 불과해서
Sort() 가 아니면 람다를 사용할 수 없고...

Sort() 메소드를 이용할 때도 Comparer가 정의되어 있어야만 합니다.


델파이 파스칼 랭귀지는 C# 보다도 언어가 초보적인 수준 밖에 안됍니다.


C#언어 역시 Java와 마찬가지로 C++ 컨셉을 차용해서 만들어진 언어라 람다 사용이 자유롭지만
this, 레퍼런스 등의 Capture 기능 등 C++ 처럼 입맛대로 람다를 디테일하게 콘트롤 할 수 있는 기능을 갖고 있는 건 아니고

C#은 그대신 간결하고 편리하게 사용할 수 있는 쪽으로 언어가 초점이 맞추어져 있습니다.



자유롭게 구사할 수 있는 언어가 파스칼 밖에 없다면 모를까
C++ 사용하면서 TList, TStringList, TArray 같은 효용성 없는 델파이 클래스를 이용할 필요가 전혀 없습니다
코드제네레이터에 의해서 옵티마이징이 드라이브 될 때도 유리할 게 없지요.

STL 이용해서 프로그래밍 하세요.



아래와 같이 STL 이용하면 모든 컨테이너에 대해서 람다를 자유롭게 사용할 수 있습니다.

#include <string>
#include <list>
#include <algorithm>

class Data
{
public:
   std::string Name;
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   std::list< Data > l;
   l.push_back( Data{"hello"} );
   l.push_back( Data{"world"} );

   auto it = std::find_if( l.begin(), l.end(), [](auto& e) { return e.Name == "world";} );

   if ( it != l.end() )
      Caption = (*it).Name.c_str();
}




rad studio 10.3.1 C++ 17 컴파일러 이용.


+ -

관련 글 리스트
75429 TList의 람다식 검색 배트맨 2504 2019/05/27
75430     Re:TList의 람다식 검색 빌더(TWx) 2851 2019/05/28
75431         Re:Re:TList의 람다식 검색 2733 2019/05/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.