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

Chris Ohk
Chris OhkEngine Engineer à 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 sur 79

Recommandé

2013 C++ Study For Students #1 par
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
4.5K vues68 diapositives
C++17 Key Features Summary - Ver 2 par
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
17.6K vues83 diapositives
C++ 11 에 대해서 쉽게 알아봅시다 1부 par
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부Gwangwhi Mah
3.9K vues38 diapositives
Modern C++ 프로그래머를 위한 CPP11/14 핵심 par
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
46.7K vues100 diapositives
[KGC 2011]Boost 라이브러리와 C++11 par
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11흥배 최
11.1K vues64 diapositives
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기 par
[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 vues71 diapositives

Contenu connexe

Tendances

C++11 par
C++11C++11
C++11선협 이
4.8K vues61 diapositives
C#을 사용한 빠른 툴 개발 par
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발흥배 최
6.5K vues58 diapositives
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기 par
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
6.8K vues79 diapositives
WTL 소개 par
WTL 소개WTL 소개
WTL 소개Wonseok Song
2.9K vues9 diapositives
프로그래밍 대회: C++11 이야기 par
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
46.5K vues62 diapositives
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍 par
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍흥배 최
33.8K vues69 diapositives

Tendances(20)

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

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

불어오는 변화의 바람, From c++98 to c++11, 14 par
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
160 vues54 diapositives
[C++ Korea] Effective Modern C++ Study item14 16 +신촌 par
[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 vues52 diapositives
Changes in c++0x par
Changes in c++0xChanges in c++0x
Changes in c++0xSang Yeon Jeon
682 vues18 diapositives
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ... par
[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 vues21 diapositives
모던 C++ 정리 par
모던 C++ 정리모던 C++ 정리
모던 C++ 정리Hansol Kang
148 vues30 diapositives
강의자료 2 par
강의자료 2강의자료 2
강의자료 2Young Wook Kim
1.1K vues45 diapositives

Similaire à [C++ Korea 2nd Seminar] C++17 Key Features Summary(20)

불어오는 변화의 바람, From c++98 to c++11, 14 par 명신 김
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김160 vues
[C++ Korea] Effective Modern C++ Study item14 16 +신촌 par 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 vues
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ... par 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 vues
[NDC2016] TERA 서버의 Modern C++ 활용기 par Sang Heon Lee
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee6.8K vues
C Language For Arduino par 영욱 김
C Language For ArduinoC Language For Arduino
C Language For Arduino
영욱 김694 vues
About Visual C++ 10 par 흥배 최
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
흥배 최1.5K vues
Let's Go (golang) par 상욱 송
Let's Go (golang)Let's Go (golang)
Let's Go (golang)
상욱 송13.2K vues
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬) par Kyoungchan Lee
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
Kyoungchan Lee71.1K vues
Tech-days 미니 토요세미나 - 3회 C#편 PPT 자료 par SeongTae Jeong
Tech-days 미니 토요세미나 - 3회 C#편 PPT 자료Tech-days 미니 토요세미나 - 3회 C#편 PPT 자료
Tech-days 미니 토요세미나 - 3회 C#편 PPT 자료
SeongTae Jeong1.6K vues
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne... par 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 vues
Python programming for Bioinformatics par Hyungyong Kim
Python programming for BioinformaticsPython programming for Bioinformatics
Python programming for Bioinformatics
Hyungyong Kim3.3K vues
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019 par min woog kim
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim3.2K vues

Plus de Chris Ohk

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍 par
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
2.2K vues44 diapositives
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들 par
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들Chris Ohk
31.3K vues44 diapositives
Momenti Seminar - 5 Years of RosettaStone par
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStoneChris Ohk
1.3K vues27 diapositives
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기 par
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기Chris Ohk
1.5K vues21 diapositives
Momenti Seminar - A Tour of Rust, Part 2 par
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 vues62 diapositives
Momenti Seminar - A Tour of Rust, Part 1 par
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Chris Ohk
795 vues45 diapositives

Plus de Chris Ohk(20)

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

[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