그 아이 님이 쓰신 글 :
: 델파이 코드는 아래와 같습니다.
:
: int __fastcall TF1::CompareLowerStr(String _a, String _b)
: {
: return CompareStr(AnsiLowerCase(_a), AnsiLowerCase(_b));
: }
: //---------------------------------------------------------------------------
: System::TStringDynArray myData;//
:
:
: 아래 부분을 어떻게 C++Builder code로 변환해야 하는지 통 모르겠습니다.
:
: TArray::Sort<String>(myData, TComparer<String>(CompareLowerStr));
답변:
사람들 잘 보지도 않는 게시판에 글을 남기면... 이제서야 봤네요...
델파이 generic으로 구현되어 있는 Sort는 아래와 같이
class procedure Sort<T>(var Values: array of T); 로 선언되어있는데...
델파이 랭귀지 신텍스에서 저 구문이 의미하는 것은
템플릿 인자인 T 타입의 다이나믹 어레이 포인터를 파라미터로 받는 static 매소드를 의미 합니다.
앞 부분의 class의 의미는 C++에서 static 메소드 역할이죠.
따라서 클래스 인스턴스 없이 메소드를 사용할 수 있고.
델파이에서...
array of string은 string 타입의 다이나믹 배열을 의미 합니다.
예를 들어서... 아래와 같은 델파이 구문이 있을 때...
procedure Foo(arr: array of string);
begin
....
end;
C++ 에서 저 메소드를 호출하려면....
Foo(OPENARRAY(String, ("hello", "2222", "4444")));
와 같은 식으로 지져분한 매크로를 사용해야 합니다.
델파이 컴파일러는...
procedure Foo(arr: array of string);
를... 실제적으로는 아래와 같은 식으로 코드 제네레이션을 하도록 구현되어 있습니다.
void Foo(void *, int value_high);
여기서 value_high는 다이나믹 어레이의 element 갯수에서 1을 뺀 값을 의미 합니다.
컴파일러를 만들 때, 저런 식으로 만든 거죠.
따라서 C++에서 델파이 다이나믹 어레이 호출구조를 사용하려면...
지져분하게 OPENARRAY 매크로를 사용해야 합니다.
OPENARRAY 매크로는 어레이의 element 갯수 - 1을 구해서
(void *, int value_high); 식으로 파라미터를 만들어 줘요.
지져분한 OPENARRAY 매크로를 사용하지 않고 코드를 작성하려면...
#include <System.Generics.Collections.hpp>
#include <System.Generics.Defaults.hpp>
void Foo::Foo()
{
String strs[] = {"222","333","111"};
TArray::Sort<String>((String*)&strs, 2);
}
위와 같이 작성하면 됩니다.
String 타입의 comparator는 디폴트로 구현되어 있기때문에 <System.Generics.Defaults.hpp>를 include 하기만 하면 됩니다.
그러나...
C++을 사용하는 이상, 델파이 generic은 사용하지 마세요.
파스칼 유닛에 정의되어있는 generic을 사용할 때 코드가 형편 없어 집니다.
파스칼 유닛에서 T가 정해져 generic 인스턴스가 결정되어 있을 경우, C++ 쪽에서 정해진 T만
사용할 수 밖에 없고, 변환된 델파이 오브젝트를 같이 링크해야 하거든요.
STL C++ template 을 손에 익혀 버릇하세요. 릴리즈로 빌드시. 더 효율적인 코드들을 생성하니까요.
일반적인 경우엔 vector, 삽입/삭제가 빈번하면 list, look-up 퍼포먼스가 필요하면 hash map.
이 3가지 유형만이라도 손에 익혀 보세요.
델파이에서 제공되는 TStringList, TList 같은 것들은 쓰잘데기 없는 것들에 불과합니다.
한가지 더...
C++ 을 사용할 거라면 델파이 interface도 사용하지 마세요.
C++ ComPtr template 래퍼 클래스를 만들어서 사용하는 게 더 낫습니다.
|