SlideShare a Scribd company logo

Modern C++의 타입 추론과 람다, 컨셉

모던 C++의 타입 추론, 람다, 컨셉에 관한 아이디어

1 of 40
Download to read offline
Modern C++의
타입 추론과 람다, 컨셉
TP5팀 박현준
Modern C++의 방향성
• 언어적으로 Compile Time에 가능한 많은 것을 보장
• 타입추론, 상수성, 람다, 템플릿 등…
• 템플릿 메타 프로그래밍 편의성 제공
auto (C++ 11)
• 변수 정의 때 명시적으로 type을 지정하지 않아도 됨
• auto로 정의한 변수는 초기화할 때 type이 결정
• 컴파일 타임 때 type이 결정
• 템플릿 프로그래밍에 사용하면 코딩이 간편.
• 코드 가독성이 향상
auto (C++ 11)
auto x1 = 10; // x1: int
const auto *x2 = &x1; // x2: const int*
std::map<int, std::string> m;
auto i1 = m.begin();
// i1: std::map<int, std::string>::iterator
template<typename T> void f(T t);
f(expr); // expr에서 T의 타입 추론
auto v = expr; // expr에서 v의 타입 추론
decltype (C++ 11)
• decltype은 표현식으로부터 타입을 유추
decltype(expression)
• auto가 값에 상응하는 타입을 추론하는 키워드라면
decltype은 값으로부터 타입을 추출하는 키워드
decltype (C++ 11)
int x = 3;
decltype(x) y = x; // y: int
struct A { double x; };
const A* a = new A(0);
decltype(a->x) x3; // x3: double
decltype((a->x)) x4; // x4: const double&

Recommended

Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features SummaryChris Ohk
 
C++17 std::byte
C++17 std::byteC++17 std::byte
C++17 std::byte진화 손
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현Bongseok Cho
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화Jaeseung Ha
 

More Related Content

What's hot

홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
DirectStroage프로그래밍소개
DirectStroage프로그래밍소개DirectStroage프로그래밍소개
DirectStroage프로그래밍소개YEONG-CHEON YOU
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건강 민우
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)Seungmo Koo
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
장재화, Replay system, NDC2011
장재화, Replay system, NDC2011장재화, Replay system, NDC2011
장재화, Replay system, NDC2011재화 장
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013Esun Kim
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1YEONG-CHEON YOU
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기Jong Wook Kim
 
[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료MinGeun Park
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
TERA Server Architecture
TERA Server ArchitectureTERA Server Architecture
TERA Server Architectureujentus
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유Hwan Min
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 

What's hot (20)

홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
DirectStroage프로그래밍소개
DirectStroage프로그래밍소개DirectStroage프로그래밍소개
DirectStroage프로그래밍소개
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
장재화, Replay system, NDC2011
장재화, Replay system, NDC2011장재화, Replay system, NDC2011
장재화, Replay system, NDC2011
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
 
[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
TERA Server Architecture
TERA Server ArchitectureTERA Server Architecture
TERA Server Architecture
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 

Similar to Modern C++의 타입 추론과 람다, 컨셉

[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3Chris Ohk
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
 
Effective modern cpp item14
Effective modern cpp item14Effective modern cpp item14
Effective modern cpp item14진화 손
 
6장 표현식 및 문장
6장 표현식 및 문장6장 표현식 및 문장
6장 표현식 및 문장재정 이
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...Seok-joon Yun
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리Hansol Kang
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부Gwangwhi Mah
 
5장 객체와클래스
5장 객체와클래스5장 객체와클래스
5장 객체와클래스SeoYeong
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 

Similar to Modern C++의 타입 추론과 람다, 컨셉 (20)

[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
Changes in c++0x
Changes in c++0xChanges in c++0x
Changes in c++0x
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
강의자료 2
강의자료 2강의자료 2
강의자료 2
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
6 function
6 function6 function
6 function
 
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
 
06장 함수
06장 함수06장 함수
06장 함수
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
 
Effective modern cpp item14
Effective modern cpp item14Effective modern cpp item14
Effective modern cpp item14
 
6장 표현식 및 문장
6장 표현식 및 문장6장 표현식 및 문장
6장 표현식 및 문장
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부
 
C++11
C++11C++11
C++11
 
5장 객체와클래스
5장 객체와클래스5장 객체와클래스
5장 객체와클래스
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 

More from HyunJoon Park

C++ Advanced 강의 5주차
C++ Advanced 강의 5주차C++ Advanced 강의 5주차
C++ Advanced 강의 5주차HyunJoon Park
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차HyunJoon Park
 
C++ Advanced 강의 소개
C++ Advanced 강의 소개C++ Advanced 강의 소개
C++ Advanced 강의 소개HyunJoon Park
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차HyunJoon Park
 
C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차HyunJoon Park
 
C++ Advanced 강의 3주차
C++ Advanced 강의 3주차C++ Advanced 강의 3주차
C++ Advanced 강의 3주차HyunJoon Park
 

More from HyunJoon Park (6)

C++ Advanced 강의 5주차
C++ Advanced 강의 5주차C++ Advanced 강의 5주차
C++ Advanced 강의 5주차
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차
 
C++ Advanced 강의 소개
C++ Advanced 강의 소개C++ Advanced 강의 소개
C++ Advanced 강의 소개
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차
 
C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차
 
C++ Advanced 강의 3주차
C++ Advanced 강의 3주차C++ Advanced 강의 3주차
C++ Advanced 강의 3주차
 

Modern C++의 타입 추론과 람다, 컨셉

  • 1. Modern C++의 타입 추론과 람다, 컨셉 TP5팀 박현준
  • 2. Modern C++의 방향성 • 언어적으로 Compile Time에 가능한 많은 것을 보장 • 타입추론, 상수성, 람다, 템플릿 등… • 템플릿 메타 프로그래밍 편의성 제공
  • 3. auto (C++ 11) • 변수 정의 때 명시적으로 type을 지정하지 않아도 됨 • auto로 정의한 변수는 초기화할 때 type이 결정 • 컴파일 타임 때 type이 결정 • 템플릿 프로그래밍에 사용하면 코딩이 간편. • 코드 가독성이 향상
  • 4. auto (C++ 11) auto x1 = 10; // x1: int const auto *x2 = &x1; // x2: const int* std::map<int, std::string> m; auto i1 = m.begin(); // i1: std::map<int, std::string>::iterator template<typename T> void f(T t); f(expr); // expr에서 T의 타입 추론 auto v = expr; // expr에서 v의 타입 추론
  • 5. decltype (C++ 11) • decltype은 표현식으로부터 타입을 유추 decltype(expression) • auto가 값에 상응하는 타입을 추론하는 키워드라면 decltype은 값으로부터 타입을 추출하는 키워드
  • 6. decltype (C++ 11) int x = 3; decltype(x) y = x; // y: int struct A { double x; }; const A* a = new A(0); decltype(a->x) x3; // x3: double decltype((a->x)) x4; // x4: const double&
  • 7. auto 반환 (C++ 11) • C++11부터 auto 타입 변환으로 후행 반환 형식을 제공 • decltype이 유연하게 auto 반환을 사용할 수 있음.
  • 8. auto 반환 (C++ 11) auto add_function(int a, int b) -> int { return a+b; } template <typename Tbuilder> auto MakeAndProcessObject(const Tbuilder& b) -> decltype(builder.makeObject()) { auto val = builder.makeObject(); return val; }
  • 9. 함수 반환 값에 대한 auto(C++14) • auto가 함수 반환 타입을 추론할 수 있도록 확장 (더 이상 후행 반환 형식을 사용할 필요 없음) • auto 반환이 템플릿 타입 추론을 따라가기 때문에 의도하는 타입변환을 위해 decltype(auto) 형식을 사용
  • 10. 함수 반환 값에 대한 auto(C++14) auto f(); // 함수 f() 선언. 반환 값 타입 불명. auto f() { return 1; } // f(): void -> int auto& f(int& x) { return x*2; } // f(): int& ->int& … auto i = 3; // i: int auto r = f(i); // r: int&
  • 11. 함수 반환 값에 대한 auto(C++14) decltype(auto) add_function(int a, int b) { return a+b; } template <typename Tbuilder> decltype(auto) MakeAndProcessObject(const Tbuilder& b) { auto val = builder.makeObject(); return val; }
  • 12. constexpr (C++ 11~) • 변수, 함수, 클래스 등을 컴파일 타임에 결정하는 한정자 • 일반화된 상수 표현식(Generalized constant expression) • 컴파일 시간에 연산을 가져옮으로써 런타임에 불필요한 연산 수행 시간 줄임 • constexpr을 붙이면 컴파일 시간에 ‘가능한’ 상수화 연산 을 진행 (확인은 std::is_literal_type)으로 확인
  • 13. constexpr 변수 (C++ 11~) constexpr float x = 42.f; // OK constexpr float y (108.f); // OK constexpr int i; // error: 초기화 필요 int j = 0; constexpr int k = j + 1; // error: 상수 계산이 불가능
  • 14. constexpr 함수 (C++ 11~) • constexpr을 함수 반환값에 사용 • 가상으로 재정의된 함수 X • 함수에 constexpr을 붙일 경우 inline을 암시 • C++11에서는 함수 본문에 지역 변수를 둘 수 없고, 하나의 반환 표현식만 와야 함. C++14에서는 제약 해제. • 템플릿 메타 프로그래밍의 친구.
  • 15. constexpr 함수 (C++ 11~) // for C++11 constexpr int factorial(int n) { return n < = 1 ? 1 : (n * factorial(n-1)); }
  • 16. constexpr 함수 (C++ 11~) // for C++14 constexpr int factorial(int n) { int result = 0; // local variable // multiple statements if (n <=1) result = 1; else result = n * factorial(n-1); return result; }
  • 17. if constexpr (C++ 17) • 컴파일 타임에 상수표현식의 boolean을 평가 • constexpr의 condition이 true이면 else statements가, false이면 then statements가 컴파일에서 제외됨.
  • 18. if constexpr (C++ 17) // int*가 인자로 넘겨지면 else { return t; }가 // 버려짐, pointer가 아니면 return *t가 버려짐. template <typename T> auto get_value(T t) { if constexpr (std::is_pointer_v<T>) return *t; else return t; }
  • 19. if constexpr (C++ 17) // without if constexpr template <int N1> constexpr auto sum() { return N1; } template <int N1, int N2, int… Ns> constexpr auto sum() { return N1 + sum <N2, Ns…>(); }
  • 20. if constexpr (C++ 17) // with if constexpr template <int N, int… Ns> constexpr auto sum() { if constepxr (sizeof…(Ns) == 0) return N; else return N + sum<Ns…>(); }
  • 21. lambda (C++ 11) • lambda 함수 또는 무명 함수라고 부름 • 함수형 프로그래밍 패러다임에서 차용, lambda는 함수 오브젝트 • 프로그램 중간에 선언이 가능하며, 현재 프로그램의 상 태를 저장할 수 있음 • C++의 표현력을 증가 시켜 줌 • STL의 알고리즘의 활용에 유용
  • 22. lambda (C++ 11) • 1. 캡쳐 절(lambda-introduction) []: 캡쳐 없음 [&]: 모든 외부 변수 by ref [=]: 모든 외부 변수 by value • 2. 매개 변수 목록 • 3. 변경 가능 사양 • 4. 예외처리 동일 • 5. 리턴 타입을 결정 • 6. 람다 몸체
  • 23. lambda (C++ 11) // lambda를 sum에 저장하고 호출 auto sum = [] (int first, int second) { return first + second; }; int res = sum(1,2); // 정의와 동시에 사용 int x = 1, y = 2; int z = [x, y](int k){return k*(x+y);}(3);
  • 24. lambda (C++ 11) // find_if 알고리즘 함수에 인자로 전달 list<int> numbers; numbers.push_back(1); … numbers.push_back(99); auto result = //const list<int>::const_iterator find_if(numbers.begin(), numbers.end(), [](int n) { return (n % 2) == 0 } ); //짝수인 첫 iterator 찾음
  • 25. lambda와 closure (C++ 11) int a = 7, b = 3; auto closureFunc = [a, b] (int x) { cout << a*x + b << endl; }; closureFunc(5); // 7*5+3 = 38 출력 a = 10, b = 20; closureFunc(5); // static lexical binding // 70이 아니라 38 출력
  • 26. generic lambda (C++ 14) • 기존(C++11까지의) lambda 함수 인자들은 auto 키워드 를 가질 수 없었음. • C++14부터는 auto 키워드를 사용할 수 있게 됨
  • 27. generic lambda (C++ 14) // for C++ 11 auto iAdd = [] (int a, int b) -> int { return a+b; } auto fAdd = [] (float a, float b) -> float { return a+b; } // for C++ 14 auto Add = [] (auto a, auto b) /*-> decltype(a+b)*/ { return a+b; }
  • 28. constexpr lambda (C++ 17) • 람다식이 constexpr로 선언되거나 캡처되거나, 상수 내에서 각 데이터 멤버의 초기화가 허용되는 경우 상수식에 사용.
  • 29. constexpr lambda (C++ 17) int y = 32; auto answer = [y]() constexpr { int x = 10; return y + x; } // answer := 42 constexpr int Increment(int n) { return [n] { return n + 1; }(); } // Increment(x)는 상수식
  • 30. concepts (C++ 20) • 템플릿 선언시, 템플릿으로 올 수 있는 타입에 대한 제한을 정의할 수 있음 • 기존에는 템플릿 프로그래밍에선 type_traits를 이용해서 이를 제한적으로 구현 함 • C++ 11부터 도입하려고 논의하였으나 17까지 표준에 들어오지 못함. 20에는 최우선적으로 논의 중.
  • 31. concepts (C++ 20) Defining concept template <template-parameter-list> concept concept-name = contraint-expression; Using concept template <template-parameter-list> requires requires-swq
  • 32. concepts (C++ 20) template<typename T> concept bool Addable = requires (T a, T b) { a + b; }; template<typename T> requires Addable<T> bool add(T a, T b) { return a == b }; add(1, 2) // it’s ok, 1+2 is ok add(“a”, “b”) // error, “a”+”b” is not ok
  • 33. concepts (C++ 20) // variable concept from the standard library template<class T, class U> concept bool Derived = std::is_based_of<U, T>::value; template<class T, class U> requires Derived T* upperCast(U* u) { return static_cast<T*>(u); } class A {}; class B : public A {}; class C; A* a1 = upperCast<A, B>(new B()); // it’s ok A* a2 = upperCast<A, C>(new C()); // compiler error. // concepts Derived doesn’t match
  • 34. concepts (C++ 20) template<typename T> using Ref = T&; template<typename T> concept C = requires { typename T::inner; // required nested member name typename S<T>; // required class template specialization typename Ref<T>; // required alias template substitution };
  • 35. concepts (C++ 20) template<typename T> concept C2 = requires(T x) { {*x} -> typename T::inner; // the expression *x must be valid // AND the type T::inner must be valid // AND the result of *x must be convertible to T::inner {x + 1} -> std::Same<int>; // the expression x + 1 must be valid // AND std::Same<decltype((x + 1)), int> must be satisfied // i.e., (x + 1) must be a prvalue of type int {x * 1} -> T; // the expression x * 1 must be valid // AND its result must be convertible to T };
  • 36. concepts 기타 특징 (C++ 20) std::list<int> l = {2, 1, 3}; std::sort(l.begin(), l.end()); • 1. 컴파일 분석이 용이해짐 – 에러의 호출 위치를 내부 구현에서 컨셉으로 가져옴 – 예) 랜덤 접근 반복자가 아니라 다른 종류의 반복자를 쓸 경우
  • 37. concepts 기타 특징 (C++ 20) // Without concepts, current error display In instantiation of 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_List_iterator<int>; _Compare = __gnu_cxx::__ops::_Iter_less_iter]': error: no match for 'operator-' (operand types are 'std::_List_iterator<int>' and 'std::_List_iterator<int>') std::__lg(__last - __first) * 2,
  • 38. concepts 기타 특징 (C++ 20) error: cannot call function 'void std::sort(_RAIter, _RAIter) [with _RAIter = std::_List_iterator<int>]‘ note: concept 'RandomAccessIterator()' was not satisfied
  • 39. concepts 기타 특징 (C++ 20) • 2. 함수 오버로드 선택 – 함수 오버로딩 시 concept에 따라 타입을 선택할 수 있음. – 만약 둘 이상의 concept를 만족시키는 경우 좀 더 제약이 많은 콘셉트와 연관된 오버로드 선택.
  • 40. concepts 기타 특징 (C++ 20) • 3. 타입추론 – 변수 선언과 함수 변환 타입을 정할 때, concept가 사용되어 무제한의 타입 추론을 하는 auto를 대체 auto x1 = f(y); //x1의 타입은 f의 리턴값에 의해 추론 Sortable x2 = f(y); //x2의 타입도 추론되나, Sortable을 만족하는 경우에만 컴파일 됨