[c++ korea] effective modern c++ study, item 11 - 13
TRANSCRIPT
Effective Modern C++ StudyC++ Korea
Effective Modern C++ StudyC++ Korea3
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
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
Effective Modern C++ StudyC++ Korea
C++98 : 링크 에러
C++11 : 컴파일 에러
6
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
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
Effective Modern C++ StudyC++ Korea
template<typename T>void processPointer(T* ptr);
9
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
Effective Modern C++ StudyC++ Korea
class Widget {public:
template<typename T>void processPointer(T* ptr) { … }
private:template<> // 오류!void processPointer<void>(void*);
};11
Effective Modern C++ StudyC++ Korea
class Widget {public:
template<typename T>void processPointer(T* ptr) { … }
};
template<>void Widget::processPointer<void>(void*) = delete;
12
Effective Modern C++ StudyC++ Korea13
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
Effective Modern C++ StudyC++ Korea16
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
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
Effective Modern C++ StudyC++ Korea19
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
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
Effective Modern C++ StudyC++ Korea22
Effective Modern C++ StudyC++ Korea24
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
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
Effective Modern C++ StudyC++ Korea27
Effective Modern C++ StudyC++ Korea
std::vector<int> values;
auto it =std::find(values.cbegin(), values.cend(), 1983);
values.insert(it, 1998);
28
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
Effective Modern C++ StudyC++ Korea
template <class C>auto cbegin(const C& container) -> decltype(std::begin(container)){
return std::begin(container);}
30
Effective Modern C++ StudyC++ Korea31