[c++ korea] effective modern c++ study, item 11 - 13

31
Effective Modern C++ Study C++ Korea

Upload: -

Post on 20-Jul-2015

419 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

Page 2: [C++ Korea] Effective Modern C++ Study, Item 11 - 13
Page 3: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea3

Page 4: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

template <class charT, class traits = char_traits<charT>>class basic_ios : public ios_base {public:

private:basic_ios(const basic_ios&); // 정의되지않음basic_ios& operator=(const basic_ios&); // 정의되지않음

4

Page 5: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

template <class charT, class traits = char_traits<charT>>class basic_ios : public ios_base {public:

…basic_ios(const basic_ios&) = delete;basic_ios& operator=(const basic_ios&) = delete;…

}

5

Page 6: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

C++98 : 링크 에러

C++11 : 컴파일 에러

6

Page 7: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

bool isLucky(int number);

if (isLucky(‘a’)) ... // ‘a’(char) -> 97(int)

if (isLucky(3.5)) … // 3.5(double) -> 3(int)if (isLucky(true)) … // true(bool) -> 1(int)

7

Page 8: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

bool isLucky(int number);

bool isLucky(char) = delete; // char 타입거부

bool isLucky(bool) = delete; // bool 타입거부

bool isLucky(double) = delete; // double, float 타입거부

8

Page 9: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

template<typename T>void processPointer(T* ptr);

9

Page 10: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

template<>void processPointer<void>(void*) = delete;template<>void processPointer<char>(char*) = delete;

template<>void processPointer<const void>(const void*) = delete;template<>void processPointer<const char>(const char*) = delete;

10

Page 11: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

class Widget {public:

template<typename T>void processPointer(T* ptr) { … }

private:template<> // 오류!void processPointer<void>(void*);

};11

Page 12: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

class Widget {public:

template<typename T>void processPointer(T* ptr) { … }

};

template<>void Widget::processPointer<void>(void*) = delete;

12

Page 13: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea13

Page 14: [C++ Korea] Effective Modern C++ Study, Item 11 - 13
Page 15: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

class Base {public:

virtual void doWork();…

};

class Derived: public Base {public:

virtual void doWork();…

};

std::unique_ptr<Base> upb =std::make_unique<Derived>();

upb->doWork();

15

Page 16: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea16

Page 17: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

class Widget {public:

…// *this가 Lvalue일때void doWork() &;// *this가 Rvalue일때void doWork() &&;

};

// 팩토리함수 (Rvalue 반환)Widget makeWidget();// 일반오브젝트(Lvalue)Widget w;// Lvalue에대한 doWork 호출w.doWork();// Rvalue에대한 doWork 호출makeWidget().doWork();

17

Page 18: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

class Base {public:

virtual void mf1() const;virtual void mf2(int x);virtual void mf3() &;void mf4() const;

};

class Derived: public Base {public:

virtual void mf1();virtual void mf2(unsigned int x);virtual void mf3() &&;void mf4() const;

};

각 함수는 무엇이 문제일까?

18

Page 19: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea19

Page 20: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

class Derived: public Base {public:

virtual void mf1() override;virtual void mf2(unsigned int x) override;virtual void mf3() && override;void mf4() const override;

};

20

Page 21: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

class Base {public:

virtual void mf1() const;virtual void mf2(int x);virtual void mf3() &;virtual mf4() const;

};

class Derived: public Base {public:

virtual void mf1() const override;virtual void mf2(int x) override;virtual void mf3() & override;void mf4() const override;

};

21

Page 22: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea22

Page 23: [C++ Korea] Effective Modern C++ Study, Item 11 - 13
Page 24: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea24

Page 25: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

std::vector<int> values;

std::vector<int>::iterator it =std::find(values.begin(), values.end(), 1983);

values.insert(it, 1998);

25

Page 26: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

typedef std::vector<int>::iterator IterT;typedef std::vector<int>::const_iterator ConstIterT;

std::vector<int> values;

ConstIterT ci =std::find(static_cast<ConstIterT>(values.begin()),

static_cast<ConstIterT>(values.end()),1983);

values.insert(static_cast<IterT>(ci), 1998); // 오류

26

Page 27: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea27

Page 28: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

std::vector<int> values;

auto it =std::find(values.cbegin(), values.cend(), 1983);

values.insert(it, 1998);

28

Page 29: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

template<typename C, typename V>void findAndInsert(C& container, const V& tarVal, const V& inVal) {

using std::cbegin, std::cend;

auto it = std::find(cbegin(container),cend(container),tarVal);

container.insert(it, inVal);}

29

Page 30: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea

template <class C>auto cbegin(const C& container) -> decltype(std::begin(container)){

return std::begin(container);}

30

Page 31: [C++ Korea] Effective Modern C++ Study, Item 11 - 13

Effective Modern C++ StudyC++ Korea31