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
[74709] Re: 만약 C++ 빌더가 C++17을 지원했더라면...
빌더(TWx) [builder] 3613 읽음    2018-01-05 21:31
자몽에이슬 님이 쓰신 글 :
: 컴포넌트 예제가 델파이 뿐이라...  이걸 빌더로 바꿔야 하는데
:
: 문법을 몰라 한번 여쭤봅니다..
: 예제는 TMS 라는 상용 컴포넌트에 있는거구요
: Grid에 combo 버튼을 넣고 combo 버튼에 이미지를 넣는겁니다.
:
: =============델파이 원문 =======
: procedure TForm1.AdvStringGrid1GetEditorProp(Sender: TObject; ACol,
:   ARow: Integer; AEditLink: TEditLink);
: {
:     with (AEditLink as TColumnComboEditLink).Combo do
:       ComboItems.Items[0].ImageIndex := 1;
:       ComboItems.Items[1].ImageIndex := 0;
:
: }
: 대략 이런 함수가 있는데 ..
:
:
: ColumnComboEditLink 라는 컴포넌트가 따로 있으며 이 컴포넌트 프로퍼티에 Item을 넣을수가 있습니다.
:
:
: 첫줄에서 턱... 하고 막히는데요..
: 이제와서 문법 더 공부하자니..  꽤 힘들군요..
: 첫줄     with (AEditLink as TColumnComboEditLink).Combo do 요것만  변환이 가능하면 나머지는 어떻게든 알아서 하겠는데
: 잘 모르겠네요..
: 나름 타입케스팅 해서 하는것 같은데 ..
:
: 연초에 새해복 많이 받으시구요 ..
:
: 잘 모르는 중생 하나 구재 부탁 드립니다..
:
:
:

답변:


델파이 파스칼 랭귀지에서 with 는 소스작성 노가다?를 줄이기 위한 소스레벨에서의 alias 기능에 불과 합니다.

만약 C++빌더가 C++17을 지원했더라면...

   if ( auto s = dynamic_cast<TColumnComboEditLink *>(AEditLink); s)
   {
        s->Combo->ComboItems->Items[0]->ImageIndex = 1;
        s->Combo->ComboItems->Items[1]->ImageIndex = 0;
   }

위와 같은 신텍스를 유용하게 써먹었을 수 있었을 텐데...
C++빌더는 아직 C++17 지원하지 않음

C++17 기능을 이용하려면 Visual C++ 2017에서 /std:c++17 옵션을 사용하거나
clang 5.0 이상을 사용해야 함.

현재 최신 버전인 Rad Studio 10.2.2도... C++ 컴파일러는 아직까지 clang/llvm 3.3.1에서 벗어나지 못하고 있음.



C++17 랭귀지 파워를 이용해서 코드를 더 간략하게 작성하는 예를 들면...
아래와 같은 코드도 더 간략하게 작성할 수 있지요.

void fun(std::string id, std::unique_ptr<Foo> foo)
{
    auto it = items.find(id);
    if (it == items.end())
    {
        auto p = items.emplace(std::move(id), std::move(foo));
        p.first->second->launch();
    }
    else
    {
        standby.push_back(std::move(foo));
        standby.back()->wait_for_notification();
    }
}



// C++17 랭귀지 파워를 이용하면 위에서 작성된 기존의 코드를 더 간략하게 작성할 수 있음.

void fun(std::string_view id, std::unique_ptr<Foo> foo)
{  
    if (auto [pos, inserted] = items.try_emplace(id, std::move(foo)); inserted)
        pos->second->launch();  
    else
        standby.emplace_back(std::move(foo))->wait_for_notification();   
}


+ -

관련 글 리스트
74706 델파이 문법 with(... as ... ) do 문법 자몽에이슬 4311 2018/01/04
74717     Re:델파이 문법 with(... as ... ) do 문법 보리 4137 2018/01/08
74709     Re: 만약 C++ 빌더가 C++17을 지원했더라면... 빌더(TWx) 3613 2018/01/05
74707     Re:델파이 문법 with(... as ... ) do 문법 kylix 3785 2018/01/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.