STL을 이용한 템플릿 클래스를 만드는게 정답이겠군요.
답변 감사합니다. ~
빌더(TWx) 님이 쓰신 글 :
: 배트맨 님이 쓰신 글 :
: : 최근에 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 컴파일러 이용.
:
: