SlideShare a Scribd company logo
1 of 67
Effective Modern C++ Study
C++ Korea
Effective Modern C++ Study
C++ Korea
template<typename T>
void logAndAdd(T&& name)
{
auto now = std::chrono::system_clock::now();
log(now, “logAndAdd”);
names.emplace(std::forward<T>(name));
}
std::string petName(“Darla”);
logAndAdd(petName);
logAndAdd(“Patty Dog”);
3
Effective Modern C++ Study
C++ Korea
std::string nameFromIdx(int idx);
void logAndAdd(int idx)
{
auto now = std::chrono::system_clock::now();
log(now, “logAndAdd”);
names.emplace(nameFromIdx(idx));
}
logAndAdd(22);
short nameIdx;
logAndAdd(nameIdx); // 오류!
4
Effective Modern C++ Study
C++ Korea5
Effective Modern C++ Study
C++ Korea
template<typename T>
void logAndAddName(T&& name) { … }
void logAndAddNameIdx(int idx) { … }
6
Effective Modern C++ Study
C++ Korea
class Person {
public:
template<typename T>
explicit Person(T&& n)
: name(std::forward<T>(n)) { }
explicit Person(int idx)
: name(nameFromIdx(idx)) { }
};
7
Effective Modern C++ Study
C++ Korea
template<typename T>
void logAndAdd(const T& name) { … }
8
Effective Modern C++ Study
C++ Korea
class Person {
public:
explicit Person(std::string n)
: name(std::move(n)) { }
explicit Person(int idx)
: name(nameFromIdx(idx)) { }
};
9
Effective Modern C++ Study
C++ Korea10
Effective Modern C++ Study
C++ Korea
오버로딩 O
오버로딩 X
11
Effective Modern C++ Study
C++ Korea
정수형인 경우
정수형이 아닌 경우
12
Effective Modern C++ Study
C++ Korea
template<typename T>
void logAndAdd(T&& name) {
logAndAddImpl(std::forward<T>(name), std::is_integral<T>());
}
13
Effective Modern C++ Study
C++ Korea
template<typename T>
void logAndAdd(T&& name) {
logAndAddImpl(std::forward<T>(name),
std::is_integral<typename std::remove_reference<T>::type>();
}
std::is_integral<std::remove_reference_t<T>>();
14
Effective Modern C++ Study
C++ Korea
template<typename T>
void logAndAddImpl(T&& name, std::false_type)
{
auto now = std::chrono::system_cloc::now();
log(now, “logAndAdd”);
names.emplace(std::forward<T>(name));
}
void logAndAddImpl(int idx, std::true_type)
{
logAndAdd(nameFromIdx(idx));
}
런타임 값
컴파일 타임 값
15
Effective Modern C++ Study
C++ Korea16
Effective Modern C++ Study
C++ Korea17
Effective Modern C++ Study
C++ Korea
class Person {
public:
template<typename T,
typename = typename std::enable_if<condition>::type>
explicit Person(T&& n);
}
http://en.cppreference.com/w/cpp/language/sfinae
18
Effective Modern C++ Study
C++ Korea
template<typename T>
T const& max(T const& a, T const& b) {
return a < b ? b : a;
}
template<typename T1, typename T2>
T1 const& max(T1 const& a, T2 const& b) {
return a < b ? b : a;
}
int g = max(1, 1.0);
타입 추론
(T = int, double)
→ 추론 과정 실패
타입 추론
(T1 = int, T2 = double)
→ 추론 성공
19
Effective Modern C++ Study
C++ Korea
=
≠
20
Effective Modern C++ Study
C++ Korea
Person p(“Nancy”);
auto cloneOfP(p);
21
Effective Modern C++ Study
C++ Korea22
Effective Modern C++ Study
C++ Korea
class Person {
public:
template<
typename T,
typename = typename std::enable_if<
!std::is_same<Person,
typename std::decay<T>::type
>::value
>::type
>
explicit Person(T&& n);
};
23
Effective Modern C++ Study
C++ Korea
class SpecialPerson : public Person {
public:
SpecialPerson(const SpecialPerson& rhs)
: Person(rhs) { … }
SpecialPerson(SpecialPerson&& rhs)
: Person(std::move(rhs)) { … }
};
24
Effective Modern C++ Study
C++ Korea25
Effective Modern C++ Study
C++ Korea
derived from
not derived
26
Effective Modern C++ Study
C++ Korea
class Person {
public:
template<
typename T,
typename = typename std::enable_if<
!std::is_base_of<Person,
typename std::decay<T>::type
>::value
>::type
>
explicit Person(T&& n);
};
27
Effective Modern C++ Study
C++ Korea
class Person {
public:
template<
typename T,
typename = std::enable_if_t<
!std::is_base_of<Person, std::decay_t<T>>::value
>
>
explicit Person(T&& n);
};
28
Effective Modern C++ Study
C++ Korea
class Person {
public:
template<
typename T,
typename = std::enable_if_t<
!std::is_base_of<Person, std::decay_t<T>>::value
&&
!std::is_integral<std::remove_reference_T<T>>::value
>
>
explicit Person(T&& n) : name(std::forward<T>(n)) { … }
explicit Person(int idx) : name(nameFromIdx(idx)) { … }
};
29
Effective Modern C++ Study
C++ Korea
퍼펙트 포워딩 사용
퍼펙트 포워딩 사용 안함
30
Effective Modern C++ Study
C++ Korea31
Effective Modern C++ Study
C++ Korea32
Effective Modern C++ Study
C++ Korea
static_assert(
std::is_constructible<std::string, T>::value,
“Parameter n can’t be used to construct a std::string”
);
33
Effective Modern C++ Study
C++ Korea34
Effective Modern C++ Study
C++ Korea36
Effective Modern C++ Study
C++ Korea37
Effective Modern C++ Study
C++ Korea38
Effective Modern C++ Study
C++ Korea39
Effective Modern C++ Study
C++ Korea40
Effective Modern C++ Study
C++ Korea41
Effective Modern C++ Study
C++ Korea42
Effective Modern C++ Study
C++ Korea43
Effective Modern C++ Study
C++ Korea44
Effective Modern C++ Study
C++ Korea45
Effective Modern C++ Study
C++ Korea46
Effective Modern C++ Study
C++ Korea47
Effective Modern C++ Study
C++ Korea49
Effective Modern C++ Study
C++ Korea
template<typename T>
void fwd(T&& param)
{
f(std::forward<T>(param));
}
template<typename… Ts>
void fwd(Ts&&… params)
{
f(std::forward<Ts>(params)…);
}
가변 템플릿 사용
f(expression);
fwd(expression);
50
Effective Modern C++ Study
C++ Korea
void f(const std::vector<int>& v);
f({1, 2, 3}); // “{1, 2, 3}”은 암시적으로 std::vector<int>로 변환됨
fwd({1, 2, 3}); // 오류! 컴파일이 되지 않음
51
Effective Modern C++ Study
C++ Korea52
Effective Modern C++ Study
C++ Korea53
Effective Modern C++ Study
C++ Korea
auto il = {1, 2, 3}; // std::initializer_list<int>로 타입 추론됨
fwd(il); // il이 f로 퍼펙트 포워딩됨
54
Effective Modern C++ Study
C++ Korea55
Effective Modern C++ Study
C++ Korea
class Widget {
public:
static const std::size_t MinVals = 28; // MinVals 선언
};
// MinVals 정의 없음
std::vector<int> widgetData;
widgetData.reserve(Widget::MinVals); // MinVals 사용
56
Effective Modern C++ Study
C++ Korea
void f(std::size_t val);
f(Widget::MinVals); // “f(28)”처럼 취급됨
fwd(Widget::MinVals); // 오류! 링크가 되지 않음
57
Effective Modern C++ Study
C++ Korea
const std::size_t Widget::MinVals; // Widget의 .cpp 파일에서
58
Effective Modern C++ Study
C++ Korea
void f(int (*pf)(int)); // pf = “Processing Function(처리 함수)”
void f(int pf(int)); // 위에 있는 f와 같음
int processVal(int value);
int processVal(int value, int property);
59
Effective Modern C++ Study
C++ Korea
f(processVal); // 정상 실행
fwd(processVal); // 오류! 어떤 processVal?
60
Effective Modern C++ Study
C++ Korea
template<typename T>
T workOnVal(T param) // 값을 처리하는 템플릿
{ … }
fwd(workOnVal); // 오류! 어떤 workOnval을 인스턴스화?
61
Effective Modern C++ Study
C++ Korea
using ProcessFuncType = int (*)(int);
ProcessFuncType processValPtr = processVal;
fwd(processValPtr); // 정상 실행
fwd(static_cast<ProcessFuncType>(workOnVal)); // 정상 실행
62
Effective Modern C++ Study
C++ Korea
struct IPv4Header {
std::uint32_t version:4,
IHL:4,
DSCP:6,
ECN:2,
totalLength:16;
};
void f(std::size_t sz);
IPv4Header h;
63
Effective Modern C++ Study
C++ Korea
f(h.totalLength); // 정상 실행
fwd(h.totalLength); // 오류!
64
Effective Modern C++ Study
C++ Korea
// 비트 필드 값의 복사본
auto length = static_cast<std::uint16_t>(h.totalLength);
fwd(length); // 복사본을 포워드
65
Effective Modern C++ Study
C++ Korea66
Effective Modern C++ Study
C++ Korea67

More Related Content

What's hot

Solid C++ by Example
Solid C++ by ExampleSolid C++ by Example
Solid C++ by ExampleOlve Maudal
 
Clean code and Code Smells
Clean code and Code SmellsClean code and Code Smells
Clean code and Code SmellsMario Sangiorgio
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features SummaryChris Ohk
 
Clean code - DSC DYPCOE
Clean code - DSC DYPCOEClean code - DSC DYPCOE
Clean code - DSC DYPCOEPatil Shreyas
 
Don't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksDon't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksVictor Rentea
 
Modern C++ Explained: Move Semantics (Feb 2018)
Modern C++ Explained: Move Semantics (Feb 2018)Modern C++ Explained: Move Semantics (Feb 2018)
Modern C++ Explained: Move Semantics (Feb 2018)Olve Maudal
 
resume algo 2023.pdf
resume algo 2023.pdfresume algo 2023.pdf
resume algo 2023.pdfsalah fenni
 
Clean Code Principles
Clean Code PrinciplesClean Code Principles
Clean Code PrinciplesYeurDreamin'
 
7 rules of simple and maintainable code
7 rules of simple and maintainable code7 rules of simple and maintainable code
7 rules of simple and maintainable codeGeshan Manandhar
 
Evolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Evolving a Clean, Pragmatic Architecture - A Craftsman's GuideEvolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Evolving a Clean, Pragmatic Architecture - A Craftsman's GuideVictor Rentea
 
clean code book summary - uncle bob - English version
clean code book summary - uncle bob - English versionclean code book summary - uncle bob - English version
clean code book summary - uncle bob - English versionsaber tabatabaee
 
Clean Code I - Best Practices
Clean Code I - Best PracticesClean Code I - Best Practices
Clean Code I - Best PracticesTheo Jungeblut
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
Chap4 Récursivité en python
Chap4 Récursivité en pythonChap4 Récursivité en python
Chap4 Récursivité en pythonMariem ZAOUALI
 
Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en JavaAziz Darouichi
 

What's hot (20)

Solid C++ by Example
Solid C++ by ExampleSolid C++ by Example
Solid C++ by Example
 
Clean code and Code Smells
Clean code and Code SmellsClean code and Code Smells
Clean code and Code Smells
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
 
Clean code - DSC DYPCOE
Clean code - DSC DYPCOEClean code - DSC DYPCOE
Clean code - DSC DYPCOE
 
Clean code
Clean codeClean code
Clean code
 
Don't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksDon't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using Mocks
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Modern C++ Explained: Move Semantics (Feb 2018)
Modern C++ Explained: Move Semantics (Feb 2018)Modern C++ Explained: Move Semantics (Feb 2018)
Modern C++ Explained: Move Semantics (Feb 2018)
 
Clean Code
Clean CodeClean Code
Clean Code
 
resume algo 2023.pdf
resume algo 2023.pdfresume algo 2023.pdf
resume algo 2023.pdf
 
Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
 
Clean Code Principles
Clean Code PrinciplesClean Code Principles
Clean Code Principles
 
7 rules of simple and maintainable code
7 rules of simple and maintainable code7 rules of simple and maintainable code
7 rules of simple and maintainable code
 
Evolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Evolving a Clean, Pragmatic Architecture - A Craftsman's GuideEvolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Evolving a Clean, Pragmatic Architecture - A Craftsman's Guide
 
clean code book summary - uncle bob - English version
clean code book summary - uncle bob - English versionclean code book summary - uncle bob - English version
clean code book summary - uncle bob - English version
 
Clean Code I - Best Practices
Clean Code I - Best PracticesClean Code I - Best Practices
Clean Code I - Best Practices
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Clean code
Clean codeClean code
Clean code
 
Chap4 Récursivité en python
Chap4 Récursivité en pythonChap4 Récursivité en python
Chap4 Récursivité en python
 
Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en Java
 

More from Chris Ohk

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

More from Chris Ohk (20)

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

[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30

  • 1. Effective Modern C++ Study C++ Korea
  • 2.
  • 3. Effective Modern C++ Study C++ Korea template<typename T> void logAndAdd(T&& name) { auto now = std::chrono::system_clock::now(); log(now, “logAndAdd”); names.emplace(std::forward<T>(name)); } std::string petName(“Darla”); logAndAdd(petName); logAndAdd(“Patty Dog”); 3
  • 4. Effective Modern C++ Study C++ Korea std::string nameFromIdx(int idx); void logAndAdd(int idx) { auto now = std::chrono::system_clock::now(); log(now, “logAndAdd”); names.emplace(nameFromIdx(idx)); } logAndAdd(22); short nameIdx; logAndAdd(nameIdx); // 오류! 4
  • 5. Effective Modern C++ Study C++ Korea5
  • 6. Effective Modern C++ Study C++ Korea template<typename T> void logAndAddName(T&& name) { … } void logAndAddNameIdx(int idx) { … } 6
  • 7. Effective Modern C++ Study C++ Korea class Person { public: template<typename T> explicit Person(T&& n) : name(std::forward<T>(n)) { } explicit Person(int idx) : name(nameFromIdx(idx)) { } }; 7
  • 8. Effective Modern C++ Study C++ Korea template<typename T> void logAndAdd(const T& name) { … } 8
  • 9. Effective Modern C++ Study C++ Korea class Person { public: explicit Person(std::string n) : name(std::move(n)) { } explicit Person(int idx) : name(nameFromIdx(idx)) { } }; 9
  • 10. Effective Modern C++ Study C++ Korea10
  • 11. Effective Modern C++ Study C++ Korea 오버로딩 O 오버로딩 X 11
  • 12. Effective Modern C++ Study C++ Korea 정수형인 경우 정수형이 아닌 경우 12
  • 13. Effective Modern C++ Study C++ Korea template<typename T> void logAndAdd(T&& name) { logAndAddImpl(std::forward<T>(name), std::is_integral<T>()); } 13
  • 14. Effective Modern C++ Study C++ Korea template<typename T> void logAndAdd(T&& name) { logAndAddImpl(std::forward<T>(name), std::is_integral<typename std::remove_reference<T>::type>(); } std::is_integral<std::remove_reference_t<T>>(); 14
  • 15. Effective Modern C++ Study C++ Korea template<typename T> void logAndAddImpl(T&& name, std::false_type) { auto now = std::chrono::system_cloc::now(); log(now, “logAndAdd”); names.emplace(std::forward<T>(name)); } void logAndAddImpl(int idx, std::true_type) { logAndAdd(nameFromIdx(idx)); } 런타임 값 컴파일 타임 값 15
  • 16. Effective Modern C++ Study C++ Korea16
  • 17. Effective Modern C++ Study C++ Korea17
  • 18. Effective Modern C++ Study C++ Korea class Person { public: template<typename T, typename = typename std::enable_if<condition>::type> explicit Person(T&& n); } http://en.cppreference.com/w/cpp/language/sfinae 18
  • 19. Effective Modern C++ Study C++ Korea template<typename T> T const& max(T const& a, T const& b) { return a < b ? b : a; } template<typename T1, typename T2> T1 const& max(T1 const& a, T2 const& b) { return a < b ? b : a; } int g = max(1, 1.0); 타입 추론 (T = int, double) → 추론 과정 실패 타입 추론 (T1 = int, T2 = double) → 추론 성공 19
  • 20. Effective Modern C++ Study C++ Korea = ≠ 20
  • 21. Effective Modern C++ Study C++ Korea Person p(“Nancy”); auto cloneOfP(p); 21
  • 22. Effective Modern C++ Study C++ Korea22
  • 23. Effective Modern C++ Study C++ Korea class Person { public: template< typename T, typename = typename std::enable_if< !std::is_same<Person, typename std::decay<T>::type >::value >::type > explicit Person(T&& n); }; 23
  • 24. Effective Modern C++ Study C++ Korea class SpecialPerson : public Person { public: SpecialPerson(const SpecialPerson& rhs) : Person(rhs) { … } SpecialPerson(SpecialPerson&& rhs) : Person(std::move(rhs)) { … } }; 24
  • 25. Effective Modern C++ Study C++ Korea25
  • 26. Effective Modern C++ Study C++ Korea derived from not derived 26
  • 27. Effective Modern C++ Study C++ Korea class Person { public: template< typename T, typename = typename std::enable_if< !std::is_base_of<Person, typename std::decay<T>::type >::value >::type > explicit Person(T&& n); }; 27
  • 28. Effective Modern C++ Study C++ Korea class Person { public: template< typename T, typename = std::enable_if_t< !std::is_base_of<Person, std::decay_t<T>>::value > > explicit Person(T&& n); }; 28
  • 29. Effective Modern C++ Study C++ Korea class Person { public: template< typename T, typename = std::enable_if_t< !std::is_base_of<Person, std::decay_t<T>>::value && !std::is_integral<std::remove_reference_T<T>>::value > > explicit Person(T&& n) : name(std::forward<T>(n)) { … } explicit Person(int idx) : name(nameFromIdx(idx)) { … } }; 29
  • 30. Effective Modern C++ Study C++ Korea 퍼펙트 포워딩 사용 퍼펙트 포워딩 사용 안함 30
  • 31. Effective Modern C++ Study C++ Korea31
  • 32. Effective Modern C++ Study C++ Korea32
  • 33. Effective Modern C++ Study C++ Korea static_assert( std::is_constructible<std::string, T>::value, “Parameter n can’t be used to construct a std::string” ); 33
  • 34. Effective Modern C++ Study C++ Korea34
  • 35.
  • 36. Effective Modern C++ Study C++ Korea36
  • 37. Effective Modern C++ Study C++ Korea37
  • 38. Effective Modern C++ Study C++ Korea38
  • 39. Effective Modern C++ Study C++ Korea39
  • 40. Effective Modern C++ Study C++ Korea40
  • 41. Effective Modern C++ Study C++ Korea41
  • 42. Effective Modern C++ Study C++ Korea42
  • 43. Effective Modern C++ Study C++ Korea43
  • 44. Effective Modern C++ Study C++ Korea44
  • 45. Effective Modern C++ Study C++ Korea45
  • 46. Effective Modern C++ Study C++ Korea46
  • 47. Effective Modern C++ Study C++ Korea47
  • 48.
  • 49. Effective Modern C++ Study C++ Korea49
  • 50. Effective Modern C++ Study C++ Korea template<typename T> void fwd(T&& param) { f(std::forward<T>(param)); } template<typename… Ts> void fwd(Ts&&… params) { f(std::forward<Ts>(params)…); } 가변 템플릿 사용 f(expression); fwd(expression); 50
  • 51. Effective Modern C++ Study C++ Korea void f(const std::vector<int>& v); f({1, 2, 3}); // “{1, 2, 3}”은 암시적으로 std::vector<int>로 변환됨 fwd({1, 2, 3}); // 오류! 컴파일이 되지 않음 51
  • 52. Effective Modern C++ Study C++ Korea52
  • 53. Effective Modern C++ Study C++ Korea53
  • 54. Effective Modern C++ Study C++ Korea auto il = {1, 2, 3}; // std::initializer_list<int>로 타입 추론됨 fwd(il); // il이 f로 퍼펙트 포워딩됨 54
  • 55. Effective Modern C++ Study C++ Korea55
  • 56. Effective Modern C++ Study C++ Korea class Widget { public: static const std::size_t MinVals = 28; // MinVals 선언 }; // MinVals 정의 없음 std::vector<int> widgetData; widgetData.reserve(Widget::MinVals); // MinVals 사용 56
  • 57. Effective Modern C++ Study C++ Korea void f(std::size_t val); f(Widget::MinVals); // “f(28)”처럼 취급됨 fwd(Widget::MinVals); // 오류! 링크가 되지 않음 57
  • 58. Effective Modern C++ Study C++ Korea const std::size_t Widget::MinVals; // Widget의 .cpp 파일에서 58
  • 59. Effective Modern C++ Study C++ Korea void f(int (*pf)(int)); // pf = “Processing Function(처리 함수)” void f(int pf(int)); // 위에 있는 f와 같음 int processVal(int value); int processVal(int value, int property); 59
  • 60. Effective Modern C++ Study C++ Korea f(processVal); // 정상 실행 fwd(processVal); // 오류! 어떤 processVal? 60
  • 61. Effective Modern C++ Study C++ Korea template<typename T> T workOnVal(T param) // 값을 처리하는 템플릿 { … } fwd(workOnVal); // 오류! 어떤 workOnval을 인스턴스화? 61
  • 62. Effective Modern C++ Study C++ Korea using ProcessFuncType = int (*)(int); ProcessFuncType processValPtr = processVal; fwd(processValPtr); // 정상 실행 fwd(static_cast<ProcessFuncType>(workOnVal)); // 정상 실행 62
  • 63. Effective Modern C++ Study C++ Korea struct IPv4Header { std::uint32_t version:4, IHL:4, DSCP:6, ECN:2, totalLength:16; }; void f(std::size_t sz); IPv4Header h; 63
  • 64. Effective Modern C++ Study C++ Korea f(h.totalLength); // 정상 실행 fwd(h.totalLength); // 오류! 64
  • 65. Effective Modern C++ Study C++ Korea // 비트 필드 값의 복사본 auto length = static_cast<std::uint16_t>(h.totalLength); fwd(length); // 복사본을 포워드 65
  • 66. Effective Modern C++ Study C++ Korea66
  • 67. Effective Modern C++ Study C++ Korea67