[C++ Korea 2nd Seminar] C++17 Key Features Summary

Chris Ohk
Chris OhkEngine Engineer em Momenti, Inc
[C++ Korea 2nd Seminar] C++17 Key Features Summary
옥찬호 / Nexon Korea, C++ Korea
C++17 Key Features Summary
시작하기 전에…
• C++17에 추가될 주요 기능들을 설명합니다.
• C++17에 추가될 주요 기능 뿐만 아니라,
이후 TS(Technical Specification)에 추가될 기능들도 소개합니다.
• C++17에 추가될 기능 중 C++11/14 지식이 필요한 경우,
이해를 돕기 위해 사전 지식을 먼저 설명합니다.
• 모든 예제 코드는 발표 이후 Github를 통해 제공됩니다.
Current C++ Status
C++17 / TS Features
• Module, Range, Concept
• Uniform Call Syntax
• Coroutine
• Contract
• Networking Library ( Boost.asio based)
• Parallel STL
• std::string_view
• std::any, std::optional (Boost.any, Boost.optional based)
• …
Module
Module
이런 상황을 고려해 봅시다.
Module
지나가던 시민
(개발자)
과일 가게
아저씨
Module
지나가던 시민
(개발자)
과일 가게
아저씨
싱싱한 과일 팝니다~
Module
지나가던 시민
(개발자)
과일 가게
아저씨
싱싱한 과일 팝니다~
사과가 맛있어 보이네요.
사과 하나 주세요.
Module
지나가던 시민
(개발자)
과일 가게
아저씨
저희 가게가 내일 휴일이라,
맛보시라고 포도랑 체리도
드릴테니 잡숴보세요~
사과가 맛있어 보이네요.
사과 하나 주세요.
Module
지나가던 시민
(개발자)
과일 가게
아저씨
저희 가게가 내일 휴일이라,
맛보시라고 포도랑 체리도
드릴테니 잡숴보세요~
와, 감사합니다.
잘 먹을게요!
Module
지나가던 시민
(개발자)
과일 가게
아저씨
저희 가게가 내일 휴일이라,
맛보시라고 포도랑 체리도
드릴테니 잡숴보세요~
와, 감사합니다.
잘 먹을게요!
Module
이제 대상을 좀 바꿔봅시다.
Module
지나가던 개발자 C++
싱싱한 함수 팝니다~
int Max(int a, int b);
int Min(int a, int b);
int Sum(int a, int b);
float Avg(int a, int b);
<cpp_math.h>
Module
지나가던 개발자 C++
싱싱한 함수 팝니다~
오, sum 함수 필요했는데…
sum 함수 하나 주세요!
int Max(int a, int b);
int Min(int a, int b);
int Sum(int a, int b);
float Avg(int a, int b);
<cpp_math.h>
Module
지나가던 개발자 C++
저희는 1+3 패키지로만
판매하고 있습니다.
전부 가져가세요~
오, sum 함수 필요했는데…
sum 함수 하나 주세요!
int Max(int a, int b);
int Min(int a, int b);
int Sum(int a, int b);
float Avg(int a, int b);
<cpp_math.h>
Module
지나가던 개발자 C++
저희는 1+3 패키지로만
판매하고 있습니다.
전부 가져가세요~
Max랑 Min 함수는
이미 구현해놨는데…
어쩌지 ㅠㅠ
int Max(int a, int b);
int Min(int a, int b);
int Sum(int a, int b);
float Avg(int a, int b);
<cpp_math.h>
Module
지나가던 개발자 C++
그건 우리 알 바 아님 ㅋ
Max랑 Min 함수는
이미 구현해놨는데…
어쩌지 ㅠㅠ
int Max(int a, int b);
int Min(int a, int b);
int Sum(int a, int b);
float Avg(int a, int b);
<cpp_math.h>
Module
지나가던 개발자 C++
그건 우리 알 바 아님 ㅋ
Max랑 Min 함수는
이미 구현해놨는데…
어쩌지 ㅠㅠ
int Max(int a, int b);
int Min(int a, int b);
int Sum(int a, int b);
float Avg(int a, int b);
<cpp_math.h>
• C++에서는 #include를 통해 헤더 파일을 포함
• 문제는 헤더 파일 안에 있는 모든 기능을 포함한다는 것!
(포함하고 싶지 않은 기능도 가져오게 됨)
• 다른 언어에서는 필요한 기능만 가져올 수 있는 기능을 제공
• C# : using System.Linq;
• Java : import java.util.Scanner;
• Python : from path import pi
• C++에서도 필요한 기능만 가져올 수 있다면 좋지 않을까?
→ Module의 등장!
Module
• 모듈에서 기억해야 할 3가지 키워드!
• module : 모듈로 정의할 이름을 지정
Ex) module M1 : 정의할 모듈의 이름은 M1이다.
• import : 가져올 모듈을 이름을 지정
Ex) import M1 : 가져올 모듈의 이름은 M1이다.
• export : 내보낼 함수의 인터페이스를을 지정
Ex) export int f(int, int)
내보낼 함수의 이름은 f이고, 리턴 타입은 int, 매개 변수는 int, int다.
Module
• Example
Module
// m1.cpp
module M1;
export int f(int, int);
int g(int x) { return x * x; }
int f(int x, int y) { return g(x) + g(y); }
// m2.cpp
module M2;
export bool g(int, int);
import std.math;
int f(int x, int y) { return x + y; }
int g(int x, int y)
{
return f(abs(x), abs(y));
}
// main.cpp
import M1;
import M2;
import std.vector;
int main()
{
return f(3, 4) + g(3, 4);
}
Concept
• 다음 코드의 출력 결과는?
Concept
#include <algorithm>
#include <list>
int main()
{
std::list<int> l = { 2, 1, 3 };
std::sort(l.begin(), l.end());
}
1, 2, 3?
아니면 3, 2, 1?
Concept
Concept
Concept
• 오류의 발생 원인
• template <class RandomIt>
void sort(RandomIt first, RandomIt last);
• 여기서 RandomIt는 ValueSwappable과 RandomAccessIterator의
요구사항을 만족해야 함
→ 하지만 int에는 반복자(Iterator)가 존재하지 않는다!
std::list<int> l = { 2, 1, 3 };
std::sort(l.begin(), l.end());
Concept
• ValueSwappable의 요구사항
ValueSwappable Swappable
Iterator CopyAssignable
CopyConstructible
Destructible
MoveConstructible
MoveAssignable
Concept
• 그러면 RandomAccessIterator는요?
• C#에서는 제약 사항과 관련해 다양한 클래스/인터페이스 제공
• ICloneable
• IComparable
• IConvertible
• IFormattable
• Nullable
• …
• C++에서는? 어… 음…
→ Concept의 등장!
Concept
• C++ 템플릿의 확장 기능 → 템플릿 매개 변수에 제약을 건다!
Concept
template <class T>
concept bool EqualityComparable()
{
return requires(T a, T b) {
{a == b}->Boolean; // Boolean is the concept defining
{a != b}->Boolean; // a type usable in boolean context
};
}
void f(const EqualityComparable&);
f("abc"s); // OK, std::string satisfies EqualityComparable
// Error: not EqualityComparable
f(std::use_facet<std::ctype<char>>(std::locale{}));
• 이제 컴파일러의 오류 메시지가 명확해진다!
Concept
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,
error: cannot call function 'void std::sort(_RAIter, _RAIter) [with _RAIter
= std::_List_iterator<int>]'
note: concept 'RandomAccessIterator()' was not satisfied
• auto 대신 Concept을 사용해 타입 추론을 할 수도 있다.
Concept
auto x1 = f(y); // the type of x1 is deduced to whatever f returns
Sortable x2 = f(y); // the type of x2 is deduced, but only compiles
// if it satisfies Sortable
• Concept 리스트
• Basic
• DefaultConstructible , MoveConstructible, CopyConstructible,
MoveAssignable, CopyAssignable, Destructible
• Library-wide
• EqualityComparable, LessThanComparable, Swappable, ValueSwappable,
NullablePointer, Hash, Allocator, FunctionObject, Callable, Predicate,
BinaryPredicate, Compare
• Iterator
• Iterator, InputIterator, OutputIterator, ForwardIterator, BidirectionalIterator
RandomAccessIterator, ContiguousIterator
• …
Concept
Ranges
Ranges
다음 세션에서 자세하게 알려드립니다.
Core Features
Fold expression
• C++11의 가변 템플릿 (Variadic Template)
template <typename T>
void PrintList(T value)
{
std::cout << value << std::endl;
}
template<typename First, typename ...Rest>
void PrintList(First first, Rest ...rest)
{
std::cout << first << ", ";
PrintList(rest...);
}
• C++11의 가변 템플릿 (Variadic Template)
PrintList(42, "Hello", 2.3, 'a');
Fold expression
42, Hello, 2.3, a
PrintList(first = 42, ...rest = “hello“, 2.3, 'a');
42
PrintList(first = 42, ...rest = 2.3, 'a');
hello
PrintList(first = 42, ...rest = 'a');
2.3
PrintList(first = 'a');
재귀 함수를 끝내기 위한
별도의 함수 필요!
template <typename T>
void PrintList(T value)
{
std::cout << value << std::endl;
}
• 가변 템플릿을 사용해 표현식을 간단하게 구현할 수 있는 기능
Fold = 접는다, Expression = 표현식 → “표현식을 접는다!”
Fold expression
template<typename... Args>
bool All(Args... args)
{
return (... && args);
}
int main()
{
// ((true && true) && true) && false
bool b = All(true, true, true, false);
}
(…) && false
((…) && true) && false
(((…) && true) && true) && false
((true && true) && true) && false
• Fold expression 문법 (E : 매개 변수 묶음, op : 연산자, I : 초기값)
• 1) 단항 오른쪽 접기 (Unary Left Fold) : E op ...
→ E1 op (... op(En-1 op En))
• 2) 단항 왼쪽 접기 (Unary Left Fold) : ... op E
→ ((E1 op E2) op ...) op En
• 3) 이항 오른쪽 접기 (Binary Right Fold) : E op ... op I
→ E1 op(... op(En-1 op(En op I)))
• 4) 이항 왼쪽 접기 (Binary Left Fold) : I op ... op E
→ (((I op E1) op E2) op ...) op En
Fold expression
• Example 1
• 3) 이항 오른쪽 접기 (Binary Right Fold) : E op ... op I
→ E1 op(... op(En-1 op(En op I)))
Fold expression
template<typename ...Args>
int Sum(Args&&... args)
{
return (args + ... + (1 * 2));
}
int main()
{
Sum(1, 2, 3, 4);
}
• Example 2
• 4) 이항 왼쪽 접기 (Binary Left Fold) : I op ... op E
→ (((I op E1) op E2) op ...) op En
Fold expression
template<typename ...Args>
void Printer(Args&&... args)
{
(std::cout << ... << args) << 'n';
}
int main()
{
Printer(1, 2, 3, "abc");
}
Attribute
• 타입, 객체, 코드 등에 구현 정의 특성을 부여
• C++14에 추가된 특성
• [[noreturn]] : 이 함수는 리턴하지 않음
• [[carries_dependency]] : 종속성 체인이 함수 안팎으로 전파됨
• [[deprecated]] : 사용할 수 있지만, 권장하지 않음 (더 이상 사용 X)
• C++17에 추가된 특성
• [[fallthrough]] : switch-case 문에서 사용, 완료되지 않음을 나타냄
• [[nodiscard]] : 함수의 리턴 값이 있는데 버리는 경우 경고문을 표시
• [[maybe_unused]] : 사용하지 않는 변수에 대해 경고문을 표시하지 않음
Attribute
• Example 1
[[noreturn]] void f()
{
throw "error"; // OK
}
[[noreturn]] void q(int i)
{
// behavior is undefined
// if called with an argument <= 0
if (i > 0) { throw "positive"; }
}
void f(int n)
{
void g(), h(), i();
switch (n)
{
case 1:
case 2:
g();
[[fallthrough]];
case 3: // no warning on fallthrough
h();
case 4: // compiler may warn on fallthrough
i();
[[fallthrough]]; // illformed, not before a case label
}
}
Attribute
• Example 2
struct [[nodiscard]] error_info { };
error_info enable_missile_safety_mode();
void launch_missiles();
void test_missiles()
{
enable_missile_safety_mode(); // compiler may warn
// on discarding a nodiscard value
launch_missiles();
}
error_info& foo();
void f1()
{
foo(); // nodiscard type is not returned by value, no warning
}
Attribute
• Example 3
Attribute
• Example 4
[[maybe_unused]] void f([[maybe_unused]] bool thing1,
[[maybe_unused]] bool thing2)
{
[[maybe_unused]] bool b = thing1 && thing2;
assert(b); // in release mode, assert is compiled out, and b is unused
// no warning because it is declared [[maybe_unused]]
} // parameters thing1 and thing2 are not used, no warning
constexpr Lambda
• C++11의 상수 표현식 (constexpr, Constant Expression)
• 쉽게 구현할 수 있는 메타 프로그래밍
• 변수의 값이나 함수의 내용을 컴파일 타임에 처리
• 함수 내에서는 하나의 표현식만 사용할 수 있고
반드시 리터럴 타입을 반환해야 했으나, C++14에서 완화됨
constexpr int n = 0; // OK
constexpr int m = time(NULL); // error C2127
constexpr int square(int x)
{
return x * x;
}
int n;
std::cin >> n;
square(n); // Processed in run-time
square(10); // Processed in compile-time
constexpr Lambda
• C++11의 람다식 (Lambda Expression)
[my_mod] (int v) -> int { return v % my_mod; }
개시자
(Introducer Capture)
인자
(Arguments)
반환 타입
(Return Type)
함수의 몸통
(Statement)
constexpr Lambda
• C++11의 람다식 (Lambda Expression)
int x = 10, y = 20;
[] {}; // Do not capture
[x] (int arg) { return x; }; // value(Copy) capture x
[=] { return x; }; // value(Copy) capture all
[&] { return y; }; // reference capture all
[&, x] { return y; }; // reference capture all except x
[=, &y] { return x; }; // value(Copy) capture all except y
[this] { return this->something; }; // this capture
[=, x] {}; // error
[&, &x] {}; // error
[=, this] {}; // error
[x, x] {}; // error
constexpr Lambda
• “람다식에 constexpr를 허하노라!”
int main()
{
constexpr auto add = [](int a, int b) { return a + b; };
Test<add(1, 2)> t1;
auto add2 = [](int a, int b) constexpr { return a + b; };
Test<add2(1, 2)> t2;
auto add3 = [](int a, int b) { return a + b; };
constexpr int c = add3(1, 2);
constexpr int(*f)(int, int) = add3;
Test<add3(1, 2)> t3;
}
• Example : 팩토리얼 (Factorial)
constexpr Lambda
int main()
{
constexpr auto Factorial = getFactorializer();
static_assert(Factorial(5) == 120, "");
static_assert(Factorial(10) == 3628800, "");
}
constexpr auto getFactorializer = [] {
unsigned int optimization[6] = {};
auto for_each = [](auto* b, auto* e, auto pred) {
auto* it = b;
while (it != e) pred(it++ - b);
};
for_each(optimization, optimization + 6, [&](int n) {
if (!n) optimization[n] = 1;
else optimization[n] = n * optimization[n - 1];
});
auto FacImpl = [=](auto fac, unsigned n) {
if (n <= 5) return optimization[n];
return n * fac(fac, n - 1);
};
auto Fact = [=](int n) {
return FacImpl(FacImpl, n);
};
return Fact;
};
constexpr Lambda
Call syntax
• 함수 호출 문법의 개선, .으로부터 봉인 해제!
class Test {
public:
void foo(int a) { }
};
int main() {
vector<int> v1;
vector<int> v2;
v1.swap(v2); // OK
swap(v1, v2); // OK in C++ 17
Test t;
t.foo(1); // OK
foo(t, 1); // OK in C++ 17
}
v1.swap(v2);
swap(v1, v2);
v1의 swap
t.foo(1);
foo(t, 1);
t의 foo
Operator. (Dot)
• .도 연산자 오버로딩 할 수 있는 시대! → “Smart Reference”
template<class X>
class Ref
{
public:
Ref(int a) : p{ new X{ a } } {}
X& operator.() { /* maybe some code here */ return *p; }
~Ref() { delete p; }
void rebind(X* pp) { delete p; p = pp; } // ...
private:
X* p;
};
Ref<X> x{ 99 };
x.f(); // means (x.operator.()).f() means (*x.p).f()
x = X{ 9 }; // means x.operator.() = X{9} means (*x.p) = X{9}
Nested namespace
• 네임스페이스를 중첩해서 사용할 수 있는 기능
// until C++14
namespace A
{
namespace B
{
namespace C
{
// ...
}
}
}
// since C++17
namespace A::B::C
{
// ...
}
Contract
• 우리는 늘 버그와 싸운다!
Contract
• 그래서 우리가 사용하는 방법, assert()!
void print_number(int* myInt)
{
assert(myInt != nullptr);
std::cout << *myInt << "n";
}
int main()
{
int a = 10;
int *b = nullptr, *c = nullptr;
b = &a;
print_number(b);
print_number(c);
}
Contract
• 계약(Contract)이란, 함수 앞에 사전 조건과 사후 조건을 추가해
assert()처럼 특정 조건을 만족하는지 검사할 수 있는 기능
(assert()보다 가독성이 좋아 더 직관적이다)
• 사전 조건(Pre-condition) : expects
• 사후 조건(Post-condition) : ensures
template<typename T>
class ArrayView
{
T& operator[](size_t i)[[expects:i < size()]];
ArrayView(const vector<T>& v)[[ensures:data() == v.data()]];
};
Contract
• Examples
struct A
{
bool f() const; bool g() const;
virtual std::string bhar()[[expects:f() && g()]];
virtual int hash()[[ensures:g()]];
virtual void gash()[[expects:g()]];
virtual double fash(int i) const[[expects:i > 0]];
};
struct B : A
{
std::string bhar() override[[expects:f()]]; // ERROR: weakening.
int hash() override[[ensures:f() && g()]]; // ERROR: strengthening.
void gash() override[[expects:g()]]; // OK: repeat from base.
double fash(int) override; // OK: inherited from base.
};
static_assert
• 컴파일 타임에 assert 검사를 수행
template <class T>
void swap(T& a, T& b)
{
static_assert(std::is_copy_constructible<T>::value, "Swap requires copying");
static_assert(std::is_nothrow_move_constructible<T>::value &&
std::is_nothrow_move_assignable<T>::value, "Swap may throw");
auto c = b; b = a; a = c;
}
int main()
{
int a, b; swap(a, b);
no_copy nc_a, nc_b; swap(nc_a, nc_b);
}
error C2338: Swap requires copying
static_assert
• 컴파일 타임에 assert 검사를 수행
template <class T>
struct data_structure
{
static_assert(std::is_default_constructible<T>::value,
"Data Structure requires default-constructible elements");
};
struct no_copy { no_copy(const no_copy&) = delete; no_copy() = default; };
struct no_default { no_default() = delete; };
int main()
{
data_structure<int> ds_ok;
data_structure<no_default> ds_error;
}
error C2338: Data Structure requires
default-constructible elements
auto
• C++11의 문제 : auto와 {}로 인해 발생하는 모호함
int main()
{
int v1{ 123 }; // 1
auto v2{ 123 }; // 2
auto v3 = { 123 }; // 3
auto v4{ 1, 2, 3 }; // 4
auto v5 = { 1, 2, 3 }; // 5
}
int
std::initializer_list<int>
std::initializer_list<int>
std::initializer_list<int>
std::initializer_list<int>
int main()
{
int v1{ 123 }; // int
auto v2{ 123 }; // std::initializer_list<int>
auto v5 = { 1, 2, 3 }; // std::initializer_list<int>
}
auto
• auto와 {}를 통한 Initializer List의 모호함 제거
int main()
{
auto x1{ 1 }; // int
auto x2 = { 2 }; // initializer_list<int>
auto x3 = { 1,2 }; // initializer_list<int>
auto x4{ 1,2 }; // error
}
Removed keywords
• C++17부터 사라지는 키워드들
// 1. register
register int a;
// 2. bool increment
bool b = 0;
++b; // bool increment
// 3. auto_ptr
auto_ptr<int> ap;
// 4. random_shuffle
int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
random_shuffle(x, x + 10);
Library Features
Parallel STL
• 순차적인 STL 처리 → 병렬적인 STL 처리
vector<int> v = { 1,2,3 };
// standard sequential sort
sort(v.begin(), v.end());
// explicitly sequential sort
sort(seq, v.begin(), v.end());
// permitting parallel execution
sort(par, v.begin(), v.end());
// permitting vectorization as well
sort(par_vec, v.begin(), v.end());
// sort with dynamically-selected execution
size_t threshold = 30;
execution_policy exec = seq;
if (v.size() > threshold)
{
exec = par;
}
sort(exec, v.begin(), v.end());
Coroutine
• Stackless Resumable Functions
• Lightweight, customizable coroutines
• Targeted to another technical specifications
• Experimental implementation in Visual Studio 2015 Update 1
• 2 × 2 × 2
• Two new keywords : await, yield
• Two new concepts : Awaitable, Coroutine Promise
• Two new types : resumable_handle, resumable_traits
• 자세한 내용은 [CppCon 2014: Gor Nishanov,
“await 2.0: Stackless Resumable Function”] 참조
(https://www.youtube.com/watch?v=KUhSjfSbINE)
Coroutine
• Example 1 : 비동기 작업 (Asynchronous Operations)
// this could be some long running computation or I/O
future<int> CalculateTheAnswer()
{
return std::async([] {
this_thread::sleep_for(1s);
return 42;
});
}
// Here is a resumable function
future<void> Coroutine()
{
std::cout << "Started waiting... n";
auto result = __await CalculateTheAnswer();
std::cout << "Got " << result << "n";
}
int main()
{
Coroutine().get();
}
Coroutine
• Example 2 : 제너레이터 패턴 (Generator Pattern)
generator<int> Fibonacci()
{
int a = 0;
int b = 1;
for (;;)
{
__yield_value a;
auto next = a + b;
a = b;
b = next;
}
}
int main()
{
for (auto v : Fibonacci())
{
if (v > 50)
break;
cout << v << endl;
}
}
any
• Boost.any 기반 라이브러리
• 모든 종류의 정보를 저장 (단, 복사 생성자를 지원해야 함)
• any_cast()를 통해 원하는 타입으로 변환된 결과를 얻을 수 있음
void foo(std::any a)
{
double d = std::any_cast<double>(a);
std::cout << d << std::endl;
}
int main()
{
foo(3.4);
}
optional
• Boost.optional 기반 라이브러리
• 함수에서 “유효하지 않은 값”을 리턴하기 위해 만들어짐
std::optional<int> Sqrt(int x)
{
if (x < 0)
return std::optional<int>();
int i = 0;
for (i = 0; i * i <= x; ++i) { }
return std::optional<int>(i - 1);
}
int main()
{
for (int i = -5; i <= 5; ++i) {
std::optional<int> x = Sqrt(i);
if (x)
std::cout << *x << std::endl;
else
std::cout << "Invalidn";
}
}
Filesystem
• Boost.filesystem 기반 라이브러리
• 파일, 경로, 디렉터리와 관련된 작업들을 수행할 수 있음
• Visual Studio 2015에서는 헤더 파일
<experimental/filesystem>을 추가해 사용할 수 있음
namespace fs = std::experimental::filesystem;
int main() {
fs::create_directories("sandbox/a/b");
std::ofstream("sandbox/file1.txt");
std::ofstream("sandbox/file2.txt");
for (auto& p : fs::directory_iterator("sandbox"))
std::cout << p << 'n';
fs::remove_all("sandbox");
}
asio
• Boost.asio 기반 라이브러리
• 네트워크 및 비동기 프로그래밍 관련 라이브러리
try {
io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));
for (;;) {
tcp::socket socket(io_service);
acceptor.accept(socket);
string message = make_daytime_string();
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
}
} catch (std::exception& e) {
std::cerr << e.what() << std::endl;
}
Summary
• C++17 표준화 작업은 현재 진행중입니다.
• 소개한 기능 외에도 다양한 추가/변경 사항들이 있습니다.
• 새 기능이 추가되었다고 무조건 다 알아야 할 필요는 없습니다.
• 모던 C++의 기능을 무조건 사용하기 보다는,
어떤 기능인지 파악하고 필요한 곳에 적절히 사용합시다.
References
• http://www.cplusplus.com/reference/
• http://en.cppreference.com/w/
• https://www.isocpp.org/
• http://www.open-std.org/
• https://blogs.msdn.microsoft.com/vcblog/
• https://github.com/chriskohlhoff/asio-tr2
• https://github.com/ericniebler/range-v3
• https://github.com/CppCon
Question?
utilForever@gmail.com
http://fb.com/utilForever
http://www.github.com/utilForever
감사합니다!
1 de 79

Recomendados

2013 C++ Study For Students #1 por
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
4.5K visualizações68 slides
C++17 Key Features Summary - Ver 2 por
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
17.6K visualizações83 slides
C++ 11 에 대해서 쉽게 알아봅시다 1부 por
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부Gwangwhi Mah
3.9K visualizações38 slides
Modern C++ 프로그래머를 위한 CPP11/14 핵심 por
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
46.7K visualizações100 slides
[KGC 2011]Boost 라이브러리와 C++11 por
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11흥배 최
11.1K visualizações64 slides
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기 por
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
11.8K visualizações71 slides

Mais conteúdo relacionado

Mais procurados

C++11 por
C++11C++11
C++11선협 이
4.8K visualizações61 slides
C#을 사용한 빠른 툴 개발 por
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발흥배 최
6.5K visualizações58 slides
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기 por
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
6.8K visualizações79 slides
WTL 소개 por
WTL 소개WTL 소개
WTL 소개Wonseok Song
2.9K visualizações9 slides
프로그래밍 대회: C++11 이야기 por
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
46.6K visualizações62 slides
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍 por
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍흥배 최
33.8K visualizações69 slides

Mais procurados(20)

C++11 por 선협 이
C++11C++11
C++11
선협 이4.8K visualizações
C#을 사용한 빠른 툴 개발 por 흥배 최
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
흥배 최6.5K visualizações
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기 por Chris Ohk
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk6.8K visualizações
WTL 소개 por Wonseok Song
WTL 소개WTL 소개
WTL 소개
Wonseok Song2.9K visualizações
프로그래밍 대회: C++11 이야기 por Jongwook Choi
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
Jongwook Choi46.6K visualizações
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍 por 흥배 최
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
흥배 최33.8K visualizações
Boost por Jin Woo Lee
BoostBoost
Boost
Jin Woo Lee2.3K visualizações
C++20 Key Features Summary por Chris Ohk
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
Chris Ohk9.9K visualizações
Refelction의 개념과 RTTR 라이브러리 por ssuser7c5a40
Refelction의 개념과 RTTR 라이브러리Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리
ssuser7c5a402.5K visualizações
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로 por Jaeseung Ha
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
Jaeseung Ha6K visualizações
Boost 라이브리와 C++11 por OnGameServer
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
OnGameServer56.7K visualizações
Boost라이브러리의내부구조 20151111 서진택 por JinTaek Seo
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
JinTaek Seo860 visualizações
포트폴리오에서 사용한 모던 C++ por KWANGIL KIM
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
KWANGIL KIM674 visualizações
Modern C++의 타입 추론과 람다, 컨셉 por HyunJoon Park
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉
HyunJoon Park205 visualizações
[C++ Korea] Effective Modern C++ Study, Item 1 - 3 por Chris Ohk
[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
Chris Ohk3K visualizações
20150212 c++11 features used in crow por Jaeseung Ha
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
Jaeseung Ha5.9K visualizações
C++ Advanced 강의 4주차 por HyunJoon Park
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차
HyunJoon Park712 visualizações
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ... por Seok-joon Yun
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Seok-joon Yun1.4K visualizações
[devil's camp] - 알고리즘 대회와 STL (박인서) por NAVER D2
[devil's camp] - 알고리즘 대회와 STL (박인서)[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)
NAVER D24.6K visualizações
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type... por Seok-joon Yun
[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 Yun3.2K visualizações

Similar a [C++ Korea 2nd Seminar] C++17 Key Features Summary

불어오는 변화의 바람, From c++98 to c++11, 14 por
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
161 visualizações54 slides
[C++ Korea] Effective Modern C++ Study item14 16 +신촌 por
[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
2.8K visualizações52 slides
Changes in c++0x por
Changes in c++0xChanges in c++0x
Changes in c++0xSang Yeon Jeon
682 visualizações18 slides
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ... por
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...Seok-joon Yun
3K visualizações21 slides
모던 C++ 정리 por
모던 C++ 정리모던 C++ 정리
모던 C++ 정리Hansol Kang
150 visualizações30 slides
강의자료 2 por
강의자료 2강의자료 2
강의자료 2Young Wook Kim
1.1K visualizações45 slides

Similar a [C++ Korea 2nd Seminar] C++17 Key Features Summary(20)

불어오는 변화의 바람, From c++98 to c++11, 14 por 명신 김
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김161 visualizações
[C++ Korea] Effective Modern C++ Study item14 16 +신촌 por Seok-joon Yun
[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 Yun2.8K visualizações
Changes in c++0x por Sang Yeon Jeon
Changes in c++0xChanges in c++0x
Changes in c++0x
Sang Yeon Jeon682 visualizações
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ... por Seok-joon Yun
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
Seok-joon Yun3K visualizações
모던 C++ 정리 por Hansol Kang
모던 C++ 정리모던 C++ 정리
모던 C++ 정리
Hansol Kang150 visualizações
강의자료 2 por Young Wook Kim
강의자료 2강의자료 2
강의자료 2
Young Wook Kim1.1K visualizações
Effective c++ chapter1 2_dcshin por Dong Chan Shin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
Dong Chan Shin463 visualizações
[NDC2016] TERA 서버의 Modern C++ 활용기 por Sang Heon Lee
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee6.8K visualizações
HI-ARC PS 101 por Jae-yeol Lee
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
Jae-yeol Lee140 visualizações
C언어 세미나 - 함수 por SeungHyun Lee
C언어 세미나 - 함수C언어 세미나 - 함수
C언어 세미나 - 함수
SeungHyun Lee340 visualizações
C Language For Arduino por 영욱 김
C Language For ArduinoC Language For Arduino
C Language For Arduino
영욱 김694 visualizações
About Visual C++ 10 por 흥배 최
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
흥배 최1.5K visualizações
6 function por 웅식 전
6 function6 function
6 function
웅식 전608 visualizações
06장 함수 por 유석 남
06장 함수06장 함수
06장 함수
유석 남1.7K visualizações
Let's Go (golang) por 상욱 송
Let's Go (golang)Let's Go (golang)
Let's Go (golang)
상욱 송13.2K visualizações
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬) por Kyoungchan Lee
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
Kyoungchan Lee71.1K visualizações
Tech-days 미니 토요세미나 - 3회 C#편 PPT 자료 por SeongTae Jeong
Tech-days 미니 토요세미나 - 3회 C#편 PPT 자료Tech-days 미니 토요세미나 - 3회 C#편 PPT 자료
Tech-days 미니 토요세미나 - 3회 C#편 PPT 자료
SeongTae Jeong1.6K visualizações
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne... por Seok-joon Yun
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
Seok-joon Yun3.1K visualizações
Python programming for Bioinformatics por Hyungyong Kim
Python programming for BioinformaticsPython programming for Bioinformatics
Python programming for Bioinformatics
Hyungyong Kim3.3K visualizações
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019 por min woog kim
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim3.2K visualizações

Mais de Chris Ohk

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍 por
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
2.3K visualizações44 slides
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들 por
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들Chris Ohk
31.4K visualizações44 slides
Momenti Seminar - 5 Years of RosettaStone por
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStoneChris Ohk
1.3K visualizações27 slides
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기 por
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기Chris Ohk
1.5K visualizações21 slides
Momenti Seminar - A Tour of Rust, Part 2 por
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2Chris Ohk
622 visualizações62 slides
Momenti Seminar - A Tour of Rust, Part 1 por
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Chris Ohk
797 visualizações45 slides

Mais de Chris Ohk(20)

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍 por Chris Ohk
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
Chris Ohk2.3K visualizações
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들 por Chris Ohk
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
Chris Ohk31.4K visualizações
Momenti Seminar - 5 Years of RosettaStone por Chris Ohk
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStone
Chris Ohk1.3K visualizações
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기 por Chris Ohk
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
Chris Ohk1.5K visualizações
Momenti Seminar - A Tour of Rust, Part 2 por Chris Ohk
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2
Chris Ohk622 visualizações
Momenti Seminar - A Tour of Rust, Part 1 por Chris Ohk
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1
Chris Ohk797 visualizações
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021 por Chris Ohk
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Chris Ohk766 visualizações
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021 por Chris Ohk
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Chris Ohk1K visualizações
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020 por Chris Ohk
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Chris Ohk1K visualizações
Proximal Policy Optimization Algorithms, Schulman et al, 2017 por Chris Ohk
Proximal Policy Optimization Algorithms, Schulman et al, 2017Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017
Chris Ohk851 visualizações
Trust Region Policy Optimization, Schulman et al, 2015 por Chris Ohk
Trust Region Policy Optimization, Schulman et al, 2015Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015
Chris Ohk666 visualizações
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015 por Chris Ohk
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Chris Ohk1.1K visualizações
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기 por Chris Ohk
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
Chris Ohk1.1K visualizações
[RLKorea] <하스스톤> 강화학습 환경 개발기 por Chris Ohk
[RLKorea] <하스스톤> 강화학습 환경 개발기[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기
Chris Ohk2.1K visualizações
[NDC 2019] 하스스톤 강화학습 환경 개발기 por Chris Ohk
[NDC 2019] 하스스톤 강화학습 환경 개발기[NDC 2019] 하스스톤 강화학습 환경 개발기
[NDC 2019] 하스스톤 강화학습 환경 개발기
Chris Ohk7K visualizações
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지 por Chris Ohk
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
Chris Ohk2K visualizações
디미고 특강 - 개발을 시작하려는 여러분에게 por Chris Ohk
디미고 특강 - 개발을 시작하려는 여러분에게디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게
Chris Ohk1.6K visualizações
청강대 특강 - 프로젝트 제대로 해보기 por Chris Ohk
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
Chris Ohk3.2K visualizações
[NDC 2018] 유체역학 엔진 개발기 por Chris Ohk
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기
Chris Ohk12.4K visualizações
My Way, Your Way por Chris Ohk
My Way, Your WayMy Way, Your Way
My Way, Your Way
Chris Ohk1.7K visualizações

[C++ Korea 2nd Seminar] C++17 Key Features Summary

  • 2. 옥찬호 / Nexon Korea, C++ Korea C++17 Key Features Summary
  • 3. 시작하기 전에… • C++17에 추가될 주요 기능들을 설명합니다. • C++17에 추가될 주요 기능 뿐만 아니라, 이후 TS(Technical Specification)에 추가될 기능들도 소개합니다. • C++17에 추가될 기능 중 C++11/14 지식이 필요한 경우, 이해를 돕기 위해 사전 지식을 먼저 설명합니다. • 모든 예제 코드는 발표 이후 Github를 통해 제공됩니다.
  • 5. C++17 / TS Features • Module, Range, Concept • Uniform Call Syntax • Coroutine • Contract • Networking Library ( Boost.asio based) • Parallel STL • std::string_view • std::any, std::optional (Boost.any, Boost.optional based) • …
  • 10. Module 지나가던 시민 (개발자) 과일 가게 아저씨 싱싱한 과일 팝니다~ 사과가 맛있어 보이네요. 사과 하나 주세요.
  • 11. Module 지나가던 시민 (개발자) 과일 가게 아저씨 저희 가게가 내일 휴일이라, 맛보시라고 포도랑 체리도 드릴테니 잡숴보세요~ 사과가 맛있어 보이네요. 사과 하나 주세요.
  • 12. Module 지나가던 시민 (개발자) 과일 가게 아저씨 저희 가게가 내일 휴일이라, 맛보시라고 포도랑 체리도 드릴테니 잡숴보세요~ 와, 감사합니다. 잘 먹을게요!
  • 13. Module 지나가던 시민 (개발자) 과일 가게 아저씨 저희 가게가 내일 휴일이라, 맛보시라고 포도랑 체리도 드릴테니 잡숴보세요~ 와, 감사합니다. 잘 먹을게요!
  • 14. Module 이제 대상을 좀 바꿔봅시다.
  • 15. Module 지나가던 개발자 C++ 싱싱한 함수 팝니다~ int Max(int a, int b); int Min(int a, int b); int Sum(int a, int b); float Avg(int a, int b); <cpp_math.h>
  • 16. Module 지나가던 개발자 C++ 싱싱한 함수 팝니다~ 오, sum 함수 필요했는데… sum 함수 하나 주세요! int Max(int a, int b); int Min(int a, int b); int Sum(int a, int b); float Avg(int a, int b); <cpp_math.h>
  • 17. Module 지나가던 개발자 C++ 저희는 1+3 패키지로만 판매하고 있습니다. 전부 가져가세요~ 오, sum 함수 필요했는데… sum 함수 하나 주세요! int Max(int a, int b); int Min(int a, int b); int Sum(int a, int b); float Avg(int a, int b); <cpp_math.h>
  • 18. Module 지나가던 개발자 C++ 저희는 1+3 패키지로만 판매하고 있습니다. 전부 가져가세요~ Max랑 Min 함수는 이미 구현해놨는데… 어쩌지 ㅠㅠ int Max(int a, int b); int Min(int a, int b); int Sum(int a, int b); float Avg(int a, int b); <cpp_math.h>
  • 19. Module 지나가던 개발자 C++ 그건 우리 알 바 아님 ㅋ Max랑 Min 함수는 이미 구현해놨는데… 어쩌지 ㅠㅠ int Max(int a, int b); int Min(int a, int b); int Sum(int a, int b); float Avg(int a, int b); <cpp_math.h>
  • 20. Module 지나가던 개발자 C++ 그건 우리 알 바 아님 ㅋ Max랑 Min 함수는 이미 구현해놨는데… 어쩌지 ㅠㅠ int Max(int a, int b); int Min(int a, int b); int Sum(int a, int b); float Avg(int a, int b); <cpp_math.h>
  • 21. • C++에서는 #include를 통해 헤더 파일을 포함 • 문제는 헤더 파일 안에 있는 모든 기능을 포함한다는 것! (포함하고 싶지 않은 기능도 가져오게 됨) • 다른 언어에서는 필요한 기능만 가져올 수 있는 기능을 제공 • C# : using System.Linq; • Java : import java.util.Scanner; • Python : from path import pi • C++에서도 필요한 기능만 가져올 수 있다면 좋지 않을까? → Module의 등장! Module
  • 22. • 모듈에서 기억해야 할 3가지 키워드! • module : 모듈로 정의할 이름을 지정 Ex) module M1 : 정의할 모듈의 이름은 M1이다. • import : 가져올 모듈을 이름을 지정 Ex) import M1 : 가져올 모듈의 이름은 M1이다. • export : 내보낼 함수의 인터페이스를을 지정 Ex) export int f(int, int) 내보낼 함수의 이름은 f이고, 리턴 타입은 int, 매개 변수는 int, int다. Module
  • 23. • Example Module // m1.cpp module M1; export int f(int, int); int g(int x) { return x * x; } int f(int x, int y) { return g(x) + g(y); } // m2.cpp module M2; export bool g(int, int); import std.math; int f(int x, int y) { return x + y; } int g(int x, int y) { return f(abs(x), abs(y)); } // main.cpp import M1; import M2; import std.vector; int main() { return f(3, 4) + g(3, 4); }
  • 25. • 다음 코드의 출력 결과는? Concept #include <algorithm> #include <list> int main() { std::list<int> l = { 2, 1, 3 }; std::sort(l.begin(), l.end()); } 1, 2, 3? 아니면 3, 2, 1?
  • 28. Concept • 오류의 발생 원인 • template <class RandomIt> void sort(RandomIt first, RandomIt last); • 여기서 RandomIt는 ValueSwappable과 RandomAccessIterator의 요구사항을 만족해야 함 → 하지만 int에는 반복자(Iterator)가 존재하지 않는다! std::list<int> l = { 2, 1, 3 }; std::sort(l.begin(), l.end());
  • 29. Concept • ValueSwappable의 요구사항 ValueSwappable Swappable Iterator CopyAssignable CopyConstructible Destructible MoveConstructible MoveAssignable
  • 31. • C#에서는 제약 사항과 관련해 다양한 클래스/인터페이스 제공 • ICloneable • IComparable • IConvertible • IFormattable • Nullable • … • C++에서는? 어… 음… → Concept의 등장! Concept
  • 32. • C++ 템플릿의 확장 기능 → 템플릿 매개 변수에 제약을 건다! Concept template <class T> concept bool EqualityComparable() { return requires(T a, T b) { {a == b}->Boolean; // Boolean is the concept defining {a != b}->Boolean; // a type usable in boolean context }; } void f(const EqualityComparable&); f("abc"s); // OK, std::string satisfies EqualityComparable // Error: not EqualityComparable f(std::use_facet<std::ctype<char>>(std::locale{}));
  • 33. • 이제 컴파일러의 오류 메시지가 명확해진다! Concept 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, error: cannot call function 'void std::sort(_RAIter, _RAIter) [with _RAIter = std::_List_iterator<int>]' note: concept 'RandomAccessIterator()' was not satisfied
  • 34. • auto 대신 Concept을 사용해 타입 추론을 할 수도 있다. Concept auto x1 = f(y); // the type of x1 is deduced to whatever f returns Sortable x2 = f(y); // the type of x2 is deduced, but only compiles // if it satisfies Sortable
  • 35. • Concept 리스트 • Basic • DefaultConstructible , MoveConstructible, CopyConstructible, MoveAssignable, CopyAssignable, Destructible • Library-wide • EqualityComparable, LessThanComparable, Swappable, ValueSwappable, NullablePointer, Hash, Allocator, FunctionObject, Callable, Predicate, BinaryPredicate, Compare • Iterator • Iterator, InputIterator, OutputIterator, ForwardIterator, BidirectionalIterator RandomAccessIterator, ContiguousIterator • … Concept
  • 39. Fold expression • C++11의 가변 템플릿 (Variadic Template) template <typename T> void PrintList(T value) { std::cout << value << std::endl; } template<typename First, typename ...Rest> void PrintList(First first, Rest ...rest) { std::cout << first << ", "; PrintList(rest...); }
  • 40. • C++11의 가변 템플릿 (Variadic Template) PrintList(42, "Hello", 2.3, 'a'); Fold expression 42, Hello, 2.3, a PrintList(first = 42, ...rest = “hello“, 2.3, 'a'); 42 PrintList(first = 42, ...rest = 2.3, 'a'); hello PrintList(first = 42, ...rest = 'a'); 2.3 PrintList(first = 'a'); 재귀 함수를 끝내기 위한 별도의 함수 필요! template <typename T> void PrintList(T value) { std::cout << value << std::endl; }
  • 41. • 가변 템플릿을 사용해 표현식을 간단하게 구현할 수 있는 기능 Fold = 접는다, Expression = 표현식 → “표현식을 접는다!” Fold expression template<typename... Args> bool All(Args... args) { return (... && args); } int main() { // ((true && true) && true) && false bool b = All(true, true, true, false); } (…) && false ((…) && true) && false (((…) && true) && true) && false ((true && true) && true) && false
  • 42. • Fold expression 문법 (E : 매개 변수 묶음, op : 연산자, I : 초기값) • 1) 단항 오른쪽 접기 (Unary Left Fold) : E op ... → E1 op (... op(En-1 op En)) • 2) 단항 왼쪽 접기 (Unary Left Fold) : ... op E → ((E1 op E2) op ...) op En • 3) 이항 오른쪽 접기 (Binary Right Fold) : E op ... op I → E1 op(... op(En-1 op(En op I))) • 4) 이항 왼쪽 접기 (Binary Left Fold) : I op ... op E → (((I op E1) op E2) op ...) op En Fold expression
  • 43. • Example 1 • 3) 이항 오른쪽 접기 (Binary Right Fold) : E op ... op I → E1 op(... op(En-1 op(En op I))) Fold expression template<typename ...Args> int Sum(Args&&... args) { return (args + ... + (1 * 2)); } int main() { Sum(1, 2, 3, 4); }
  • 44. • Example 2 • 4) 이항 왼쪽 접기 (Binary Left Fold) : I op ... op E → (((I op E1) op E2) op ...) op En Fold expression template<typename ...Args> void Printer(Args&&... args) { (std::cout << ... << args) << 'n'; } int main() { Printer(1, 2, 3, "abc"); }
  • 45. Attribute • 타입, 객체, 코드 등에 구현 정의 특성을 부여 • C++14에 추가된 특성 • [[noreturn]] : 이 함수는 리턴하지 않음 • [[carries_dependency]] : 종속성 체인이 함수 안팎으로 전파됨 • [[deprecated]] : 사용할 수 있지만, 권장하지 않음 (더 이상 사용 X) • C++17에 추가된 특성 • [[fallthrough]] : switch-case 문에서 사용, 완료되지 않음을 나타냄 • [[nodiscard]] : 함수의 리턴 값이 있는데 버리는 경우 경고문을 표시 • [[maybe_unused]] : 사용하지 않는 변수에 대해 경고문을 표시하지 않음
  • 46. Attribute • Example 1 [[noreturn]] void f() { throw "error"; // OK } [[noreturn]] void q(int i) { // behavior is undefined // if called with an argument <= 0 if (i > 0) { throw "positive"; } }
  • 47. void f(int n) { void g(), h(), i(); switch (n) { case 1: case 2: g(); [[fallthrough]]; case 3: // no warning on fallthrough h(); case 4: // compiler may warn on fallthrough i(); [[fallthrough]]; // illformed, not before a case label } } Attribute • Example 2
  • 48. struct [[nodiscard]] error_info { }; error_info enable_missile_safety_mode(); void launch_missiles(); void test_missiles() { enable_missile_safety_mode(); // compiler may warn // on discarding a nodiscard value launch_missiles(); } error_info& foo(); void f1() { foo(); // nodiscard type is not returned by value, no warning } Attribute • Example 3
  • 49. Attribute • Example 4 [[maybe_unused]] void f([[maybe_unused]] bool thing1, [[maybe_unused]] bool thing2) { [[maybe_unused]] bool b = thing1 && thing2; assert(b); // in release mode, assert is compiled out, and b is unused // no warning because it is declared [[maybe_unused]] } // parameters thing1 and thing2 are not used, no warning
  • 50. constexpr Lambda • C++11의 상수 표현식 (constexpr, Constant Expression) • 쉽게 구현할 수 있는 메타 프로그래밍 • 변수의 값이나 함수의 내용을 컴파일 타임에 처리 • 함수 내에서는 하나의 표현식만 사용할 수 있고 반드시 리터럴 타입을 반환해야 했으나, C++14에서 완화됨 constexpr int n = 0; // OK constexpr int m = time(NULL); // error C2127 constexpr int square(int x) { return x * x; } int n; std::cin >> n; square(n); // Processed in run-time square(10); // Processed in compile-time
  • 51. constexpr Lambda • C++11의 람다식 (Lambda Expression) [my_mod] (int v) -> int { return v % my_mod; } 개시자 (Introducer Capture) 인자 (Arguments) 반환 타입 (Return Type) 함수의 몸통 (Statement)
  • 52. constexpr Lambda • C++11의 람다식 (Lambda Expression) int x = 10, y = 20; [] {}; // Do not capture [x] (int arg) { return x; }; // value(Copy) capture x [=] { return x; }; // value(Copy) capture all [&] { return y; }; // reference capture all [&, x] { return y; }; // reference capture all except x [=, &y] { return x; }; // value(Copy) capture all except y [this] { return this->something; }; // this capture [=, x] {}; // error [&, &x] {}; // error [=, this] {}; // error [x, x] {}; // error
  • 53. constexpr Lambda • “람다식에 constexpr를 허하노라!” int main() { constexpr auto add = [](int a, int b) { return a + b; }; Test<add(1, 2)> t1; auto add2 = [](int a, int b) constexpr { return a + b; }; Test<add2(1, 2)> t2; auto add3 = [](int a, int b) { return a + b; }; constexpr int c = add3(1, 2); constexpr int(*f)(int, int) = add3; Test<add3(1, 2)> t3; }
  • 54. • Example : 팩토리얼 (Factorial) constexpr Lambda int main() { constexpr auto Factorial = getFactorializer(); static_assert(Factorial(5) == 120, ""); static_assert(Factorial(10) == 3628800, ""); }
  • 55. constexpr auto getFactorializer = [] { unsigned int optimization[6] = {}; auto for_each = [](auto* b, auto* e, auto pred) { auto* it = b; while (it != e) pred(it++ - b); }; for_each(optimization, optimization + 6, [&](int n) { if (!n) optimization[n] = 1; else optimization[n] = n * optimization[n - 1]; }); auto FacImpl = [=](auto fac, unsigned n) { if (n <= 5) return optimization[n]; return n * fac(fac, n - 1); }; auto Fact = [=](int n) { return FacImpl(FacImpl, n); }; return Fact; }; constexpr Lambda
  • 56. Call syntax • 함수 호출 문법의 개선, .으로부터 봉인 해제! class Test { public: void foo(int a) { } }; int main() { vector<int> v1; vector<int> v2; v1.swap(v2); // OK swap(v1, v2); // OK in C++ 17 Test t; t.foo(1); // OK foo(t, 1); // OK in C++ 17 } v1.swap(v2); swap(v1, v2); v1의 swap t.foo(1); foo(t, 1); t의 foo
  • 57. Operator. (Dot) • .도 연산자 오버로딩 할 수 있는 시대! → “Smart Reference” template<class X> class Ref { public: Ref(int a) : p{ new X{ a } } {} X& operator.() { /* maybe some code here */ return *p; } ~Ref() { delete p; } void rebind(X* pp) { delete p; p = pp; } // ... private: X* p; }; Ref<X> x{ 99 }; x.f(); // means (x.operator.()).f() means (*x.p).f() x = X{ 9 }; // means x.operator.() = X{9} means (*x.p) = X{9}
  • 58. Nested namespace • 네임스페이스를 중첩해서 사용할 수 있는 기능 // until C++14 namespace A { namespace B { namespace C { // ... } } } // since C++17 namespace A::B::C { // ... }
  • 59. Contract • 우리는 늘 버그와 싸운다!
  • 60. Contract • 그래서 우리가 사용하는 방법, assert()! void print_number(int* myInt) { assert(myInt != nullptr); std::cout << *myInt << "n"; } int main() { int a = 10; int *b = nullptr, *c = nullptr; b = &a; print_number(b); print_number(c); }
  • 61. Contract • 계약(Contract)이란, 함수 앞에 사전 조건과 사후 조건을 추가해 assert()처럼 특정 조건을 만족하는지 검사할 수 있는 기능 (assert()보다 가독성이 좋아 더 직관적이다) • 사전 조건(Pre-condition) : expects • 사후 조건(Post-condition) : ensures template<typename T> class ArrayView { T& operator[](size_t i)[[expects:i < size()]]; ArrayView(const vector<T>& v)[[ensures:data() == v.data()]]; };
  • 62. Contract • Examples struct A { bool f() const; bool g() const; virtual std::string bhar()[[expects:f() && g()]]; virtual int hash()[[ensures:g()]]; virtual void gash()[[expects:g()]]; virtual double fash(int i) const[[expects:i > 0]]; }; struct B : A { std::string bhar() override[[expects:f()]]; // ERROR: weakening. int hash() override[[ensures:f() && g()]]; // ERROR: strengthening. void gash() override[[expects:g()]]; // OK: repeat from base. double fash(int) override; // OK: inherited from base. };
  • 63. static_assert • 컴파일 타임에 assert 검사를 수행 template <class T> void swap(T& a, T& b) { static_assert(std::is_copy_constructible<T>::value, "Swap requires copying"); static_assert(std::is_nothrow_move_constructible<T>::value && std::is_nothrow_move_assignable<T>::value, "Swap may throw"); auto c = b; b = a; a = c; } int main() { int a, b; swap(a, b); no_copy nc_a, nc_b; swap(nc_a, nc_b); } error C2338: Swap requires copying
  • 64. static_assert • 컴파일 타임에 assert 검사를 수행 template <class T> struct data_structure { static_assert(std::is_default_constructible<T>::value, "Data Structure requires default-constructible elements"); }; struct no_copy { no_copy(const no_copy&) = delete; no_copy() = default; }; struct no_default { no_default() = delete; }; int main() { data_structure<int> ds_ok; data_structure<no_default> ds_error; } error C2338: Data Structure requires default-constructible elements
  • 65. auto • C++11의 문제 : auto와 {}로 인해 발생하는 모호함 int main() { int v1{ 123 }; // 1 auto v2{ 123 }; // 2 auto v3 = { 123 }; // 3 auto v4{ 1, 2, 3 }; // 4 auto v5 = { 1, 2, 3 }; // 5 } int std::initializer_list<int> std::initializer_list<int> std::initializer_list<int> std::initializer_list<int> int main() { int v1{ 123 }; // int auto v2{ 123 }; // std::initializer_list<int> auto v5 = { 1, 2, 3 }; // std::initializer_list<int> }
  • 66. auto • auto와 {}를 통한 Initializer List의 모호함 제거 int main() { auto x1{ 1 }; // int auto x2 = { 2 }; // initializer_list<int> auto x3 = { 1,2 }; // initializer_list<int> auto x4{ 1,2 }; // error }
  • 67. Removed keywords • C++17부터 사라지는 키워드들 // 1. register register int a; // 2. bool increment bool b = 0; ++b; // bool increment // 3. auto_ptr auto_ptr<int> ap; // 4. random_shuffle int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; random_shuffle(x, x + 10);
  • 69. Parallel STL • 순차적인 STL 처리 → 병렬적인 STL 처리 vector<int> v = { 1,2,3 }; // standard sequential sort sort(v.begin(), v.end()); // explicitly sequential sort sort(seq, v.begin(), v.end()); // permitting parallel execution sort(par, v.begin(), v.end()); // permitting vectorization as well sort(par_vec, v.begin(), v.end()); // sort with dynamically-selected execution size_t threshold = 30; execution_policy exec = seq; if (v.size() > threshold) { exec = par; } sort(exec, v.begin(), v.end());
  • 70. Coroutine • Stackless Resumable Functions • Lightweight, customizable coroutines • Targeted to another technical specifications • Experimental implementation in Visual Studio 2015 Update 1 • 2 × 2 × 2 • Two new keywords : await, yield • Two new concepts : Awaitable, Coroutine Promise • Two new types : resumable_handle, resumable_traits • 자세한 내용은 [CppCon 2014: Gor Nishanov, “await 2.0: Stackless Resumable Function”] 참조 (https://www.youtube.com/watch?v=KUhSjfSbINE)
  • 71. Coroutine • Example 1 : 비동기 작업 (Asynchronous Operations) // this could be some long running computation or I/O future<int> CalculateTheAnswer() { return std::async([] { this_thread::sleep_for(1s); return 42; }); } // Here is a resumable function future<void> Coroutine() { std::cout << "Started waiting... n"; auto result = __await CalculateTheAnswer(); std::cout << "Got " << result << "n"; } int main() { Coroutine().get(); }
  • 72. Coroutine • Example 2 : 제너레이터 패턴 (Generator Pattern) generator<int> Fibonacci() { int a = 0; int b = 1; for (;;) { __yield_value a; auto next = a + b; a = b; b = next; } } int main() { for (auto v : Fibonacci()) { if (v > 50) break; cout << v << endl; } }
  • 73. any • Boost.any 기반 라이브러리 • 모든 종류의 정보를 저장 (단, 복사 생성자를 지원해야 함) • any_cast()를 통해 원하는 타입으로 변환된 결과를 얻을 수 있음 void foo(std::any a) { double d = std::any_cast<double>(a); std::cout << d << std::endl; } int main() { foo(3.4); }
  • 74. optional • Boost.optional 기반 라이브러리 • 함수에서 “유효하지 않은 값”을 리턴하기 위해 만들어짐 std::optional<int> Sqrt(int x) { if (x < 0) return std::optional<int>(); int i = 0; for (i = 0; i * i <= x; ++i) { } return std::optional<int>(i - 1); } int main() { for (int i = -5; i <= 5; ++i) { std::optional<int> x = Sqrt(i); if (x) std::cout << *x << std::endl; else std::cout << "Invalidn"; } }
  • 75. Filesystem • Boost.filesystem 기반 라이브러리 • 파일, 경로, 디렉터리와 관련된 작업들을 수행할 수 있음 • Visual Studio 2015에서는 헤더 파일 <experimental/filesystem>을 추가해 사용할 수 있음 namespace fs = std::experimental::filesystem; int main() { fs::create_directories("sandbox/a/b"); std::ofstream("sandbox/file1.txt"); std::ofstream("sandbox/file2.txt"); for (auto& p : fs::directory_iterator("sandbox")) std::cout << p << 'n'; fs::remove_all("sandbox"); }
  • 76. asio • Boost.asio 기반 라이브러리 • 네트워크 및 비동기 프로그래밍 관련 라이브러리 try { io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13)); for (;;) { tcp::socket socket(io_service); acceptor.accept(socket); string message = make_daytime_string(); boost::system::error_code ignored_error; boost::asio::write(socket, boost::asio::buffer(message), ignored_error); } } catch (std::exception& e) { std::cerr << e.what() << std::endl; }
  • 77. Summary • C++17 표준화 작업은 현재 진행중입니다. • 소개한 기능 외에도 다양한 추가/변경 사항들이 있습니다. • 새 기능이 추가되었다고 무조건 다 알아야 할 필요는 없습니다. • 모던 C++의 기능을 무조건 사용하기 보다는, 어떤 기능인지 파악하고 필요한 곳에 적절히 사용합시다.
  • 78. References • http://www.cplusplus.com/reference/ • http://en.cppreference.com/w/ • https://www.isocpp.org/ • http://www.open-std.org/ • https://blogs.msdn.microsoft.com/vcblog/ • https://github.com/chriskohlhoff/asio-tr2 • https://github.com/ericniebler/range-v3 • https://github.com/CppCon