28. Overview
vector<vector<int>>
user-defined
literals thread_local
=default, =delete
atomic<T> auto f() -> int
array<T, N>
decltype
vector<LocalType> noexcept
regex
initializer lists
constexpr
extern template
C++
unordered_map<int, string>raw string literals
nullptr auto i = v.begin();
async
lambdas
[]{ foo(); }
template
aliases
unique_ptr<T>
shared_ptr<T>
weak_ptr<T>
thread, mutex
for (x : coll)
override,
final
variadic templates
template <typename T…>
function<> future<T>
tuple<int, float, string>
strongly-typed enums
enum class E {…};
static_assert(x)
rvalue references
(move semantics)
delegating constructors
29. Overview
vector<vector<int>>
user-defined
literals thread_local
=default, =delete
atomic<T> auto f() -> int
array<T, N>
decltype
vector<LocalType> noexcept
regex
initializer lists
constexpr
extern template
C++
unordered_map<int, string>raw string literals
nullptr auto i = v.begin();
async
lambdas
[]{ foo(); }
template
aliases
unique_ptr<T>
shared_ptr<T>
weak_ptr<T>
thread, mutex
for (x : coll)
override,
final
variadic templates
template <typename T…>
function<> future<T>
tuple<int, float, string>
strongly-typed enums
enum class E {…};
static_assert(x)
rvalue references
(move semantics)
delegating constructors
30. Overview
vector<vector<int>>
user-defined
literals thread_local
=default, =delete
atomic<T> auto f() -> int
array<T, N>
decltype
vector<LocalType> noexcept
regex
initializer lists
constexpr
extern template
C++
unordered_map<int, string>raw string literals
nullptr auto i = v.begin();
async
lambdas
[]{ foo(); }
template
aliases
unique_ptr<T>
shared_ptr<T>
weak_ptr<T>
thread, mutex
for (x : coll)
override,
final
variadic templates
template <typename T…>
function<> future<T>
tuple<int, float, string>
strongly-typed enums
enum class E {…};
static_assert(x)
rvalue references
(move semantics)
delegating constructors
31. auto
map<string, string>::const_iterator it = m.cbegin();
double const param = config["param"];
singleton& s = singleton::instance();
auto it = m.begin();
auto const param = config["param"];
auto& s = singleton::instance();
컴파일 타임 추론
40. Variadic Template
print_list(42, “hello”, 2.3, ‘a’);
print_list(first = 42, …rest = “hello”, 2.3, ‘a’)
42
print_list(first = “hello”, …rest = 2.3, ‘a’)
hello
print_list(first = 2.3, …rest = ‘a’)
2.3
print_list(value = ‘a’)
a
42, hello, 2.3, a
template<class T>
void print_list(T value) { … }
재귀 함수를 끝내기 위한
별도의 함수 필요
41. Delegating Constructors
class A {
int a;
void validate(int x) {
if (x > 0 && x <= 42) a = x;
}
public:
A(int x) { validate(x); }
A() { validate(42); }
A(string s) { int x = stoi(s); validate(x); }
};
생성자를 각각 구현하고, 별도의 함수 호출
42. Delegating Constructors
class A {
int a;
public:
A(int x) {
if (x > 0 && x <= 42) a = x;
}
A() : A(42) { }
A(string s) : A(stoi(s)) { }
};
1개의 생성자를 구현한 뒤, 위임 호출
48. Boost
• http://www.boost.org
• C++ 위원회 멤버들로부터 시작된 오픈 소스 라이브러리
• C++ 표준 라이브러리가 업데이트 될 때
Boost 라이브러리에 있는 많은 기능들이 채택됨
• Boost.Asio, Boost.Log, Boost.ScopeExit 등
• References
• boost.org 문서
• Boost.Asio를 이용한 네트워크 프로그래밍
(한빛미디어, 2013)
49. Case Studies : CGSF
• https://github.com/pdpdds/CGSF
• 캐주얼 게임을 위해 제작된 서버 라이브러리
• Boost.Asio를 커스터마이징해 네트워크 엔진으로 사용
50. Qt
• http://qt-project.org
• GUI 프로그램 개발에 널리 쓰이는 크로스 플랫폼 프레임워크
• C++을 주로 사용하지만, Python, Ruby, C, Perl, Pascal과도 연동
• SQL DB 접근, XML 처리, Thread 관리, 파일 관리 API 제공
• References
• qt-project.org 문서
• QT5 프로그래밍 가이드(성안당, 2014)
• QT4를 이용한 C++ GUI 프로그래밍
(아이티씨, 2009)
52. C++ AMP(Accelerated Massive Parallelism)
• http://msdn.microsoft.com/ko-kr/library/hh265136.aspx
• VS C++에서 GPGPU 프로그래밍 환경을 제공
• 또 다른 컴파일러나 다른 구문을 배울 필요가 없음
• C++ AMP는 DirectX의 DirectCompute 사용,
Microsoft Vista 이상에서만 사용 가능 (DirectX10에서 지원)
• References
• MSDN 문서
• C++ AMP : Visual C++와 GPGPU를 이용한
대규모 병렬 프로그래밍 (한빛미디어, 2013)
먼저 C++ Korea 커뮤니티에 대한 소개를 간단히 하고, C++11/14에 추가된 새로운 기능들을 알아볼 것입니다. 다음, 차기 표준이 될 C++17에 추가될 기능 중 몇 가지를 미리 알아보고 관련된 C++ 라이브러리 몇 가지를 소개하며 세션을 마무리할 것입니다.
먼저 C++ Korea 커뮤니티에 대한 소개를 하겠습니다.
C++ Korea는 변화하고 있는 C++ 표준에 대비하기 위해 한국 C++ 사용자들과의 정보 공유 및 교류를 목적으로 2013년 11월, 페이스북 그룹으로 개설되었습니다.
이후 꾸준한 노력 끝에 2014년 하반기 마이크로소프트 개발자 커뮤니티 멜팅팟 프로그램 2기에 선정되었습니다.
멜팅팟 프로그램 선정을 시작으로 10월 1기 운영진 8명을 선발했고, 오늘 멜팅팟 세미나를 개최하게 되었습니다.
앞으로 세미나 개최를 발판 삼아 Effective Modern C++ 스터디를 진행할 예정입니다.
자세한 사항은 그룹 공지사항을 참조해 주시길 바라며, 모던 C++에 관심 있는 여러분들의 많은 참여 부탁드립니다.
앞서 말씀드렸다시피, C++은 2011년도 C++11 표준을 발표한 이래로 3년마다 새로운 표준을 내놓고 있습니다.
올해는 C++14 표준을 발표했는데, 이렇게 새로운 표준을 제정하는 단체가 있습니다. 바로 ISO C++ 위원회입니다.
C++ Korea는 변화하고 있는 C++ 표준에 대비하기 위해 한국 C++ 사용자들과의 정보 공유 및 교류를 목적으로 2013년 11월, 페이스북 그룹으로 개설되었습니다.
이후 꾸준한 노력 끝에 2014년 하반기 마이크로소프트 개발자 커뮤니티 멜팅팟 프로그램 2기에 선정되었습니다.
멜팅팟 프로그램 선정을 시작으로 10월 1기 운영진 8명을 선발했고, 오늘 멜팅팟 세미나를 개최하게 되었습니다.
앞으로 세미나 개최를 발판 삼아 Effective Modern C++ 스터디를 진행할 예정입니다.
자세한 사항은 그룹 공지사항을 참조해 주시길 바라며, 모던 C++에 관심 있는 여러분들의 많은 참여 부탁드립니다.
앞서 말씀드렸다시피, C++은 2011년도 C++11 표준을 발표한 이래로 3년마다 새로운 표준을 내놓고 있습니다.
올해는 C++14 표준을 발표했는데, 이렇게 새로운 표준을 제정하는 단체가 있습니다. 바로 ISO C++ 위원회입니다.
ISO C++ 위원회는 ISO C++ 표준을 승인하는 기구로서, C++의 창시자인 비야네 스트롭스트룹, Exception C++ 시리즈의 저자인 허브 서터 등이 위원회 소속으로 있습니다.
이들은 정기적으로 모여 새로운 C++ 표준에 추가하거나 변경, 삭제될 기능들을 논의합니다.
오른쪽에 보시는 그림은 최근 C++14 표준화 작업을 완료하고 나서 찍은 기념 사진인데, C++의 표준을 제정하기 위해 많은 사람들이 노력하고 있다는 사실을 알 수 있습니다.
C++ 위원회는 크게 2개의 Working Group으로 구성되어 있는데, 언어의 핵심 기능에 대한 작업을 담당하는 Core WG, C++과 관련된 라이브러리에 대한 작업을 담당하는 Library WG가 있습니다.
WG 안에는 Study Group이라고 부르는 12개의 SG가 있으며, SG는 각자 맡은 분야에 따라 새로운 기능을 제안합니다.
한 예로, SG1 Concurrency & Parallelism에서 Parallel STL을 제안했으며, 현재 Codeplex에서 오픈 소스로 작업중입니다.
하지만, ISO C++ 위원회에서 새로운 표준을 발표하더라도 컴파일러가 지원하지 않으면 사용할 수 없습니다.
현재 Visual Studio는 C++11/14 표준을 어느 정도 지원하고 있을까요?
보고계신 표는 Visual Studio 2013 11월 CTP와 Visual Studio 2015에서 지원하고 있는 C++ 표준 기능을 나타내고 있습니다.
마이크로소프트에서는 C++11과 14를 동일한 표준으로 보고, 사용자들이 자주 사용하는 기능을 우선적으로 지원하고 있습니다.
개인적인 판단으로는 비교적 다른 컴파일러에 비해 C++ 표준 지원 시기는 늦지만, 그만큼 안정성을 보장한다고 생각합니다.
지금부터는 C++11/14 표준에 새롭게 추가된 주요 기능에 대해 알아보도록 하겠습니다.
다음은 C++11에 추가된 주요 기능입니다.
auto, nullptr, lambda, rvalue references 등 많은 기능들이 보입니다.
이 중에서 주요 기능인 rvalue references, constexpr, lambda, async, future 등은 뒷 세션에서 자세히 알아보도록 하겠습니다.
이번 세션에서는 세미나가 끝난 뒤 돌아가셔서 바로 사용하실 수 있는 간단한 기능 몇 가지를 알아보도록 하겠습니다.
먼저, auto에 대한 설명을 드리도록 하겠습니다.
위에 보시는 예제들은 프로젝트 작업 중 자주 볼 수 있는 코드입니다.
첫 번째 예제를 보시면 반복문을 수행하기 위해 map의 const_iterator를 선언하고 있는데,
map의 구조로 인해 불필요하게 입력해야 되는 경우가 많았습니다.
하지만, C++11의 auto를 사용하면 자동 추론을 통해 불필요한 입력을 간소화할 수 있습니다.
map<string, string>>::const_iterator를 auto로 줄일 수 있다니, 정말 멋진 일이 아닐 수 없습니다.
다만, auto를 사용하실 때 주의하실 점이 두 가지 있습니다.
첫 번째는 auto가 완벽하진 않기 때문에 const나 레퍼런스 타입을 추론하지 못합니다.
두 번째, 세 번째 예제를 보시면 각각 const와 레퍼런스 타입으로 선언되어 있는데,
auto를 사용하더라도 밑에 보시는 것과 같이 const와 &는 추론되지 않습니다.
두 번째로 주의하실 점은 auto를 사용하실 때는 =의 오른쪽에 있는 표현식으로 왼쪽의 타입을 컴파일 타임에 추론할 수 있어야 합니다.
만약 컴파일 타임에 타입을 추론할 수 없다면, 오류가 발생하게 됩니다.
이 두 가지만 주의하시면, 불필요하게 긴 타입을 auto로 대체해서 사용할 수 있을 것입니다.
다음은 decltype입니다. 다음 템플릿 예제를 한 번 보도록 하겠습니다.
T 타입 x와 U 타입 y를 더한 결과를 반환하는 함수입니다.
이 때 T, U에 어떤 타입이 오냐에 따라 반환형이 달라지게 됩니다.
예를 들어, T 타입이 int, U 타입이 float이라면 반환형은 int + float이 되는데 정수형이 실수형으로 변환되므로 float이 됩니다.
다른 예를 들어봅시다. 만약 T 타입이 vector이고, U 타입이 int라면 반환형은 어떻게 될까요?
반환형이 vector + int가 되는데, 이를 어떻게 표현할 수 있을까요?