4. Effective Modern C++ Study
C++ 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
5. Effective Modern C++ Study
C++ 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
7. Effective Modern C++ Study
C++ 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
8. Effective Modern C++ Study
C++ Korea
bool isLucky(int number);
bool isLucky(char) = delete; // char 타입 거부
bool isLucky(bool) = delete; // bool 타입 거부
bool isLucky(double) = delete; // double, float 타입 거부
8
9. Effective Modern C++ Study
C++ Korea
template<typename T>
void processPointer(T* ptr);
9
10. Effective Modern C++ Study
C++ 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
11. Effective Modern C++ Study
C++ Korea
class Widget {
public:
template<typename T>
void processPointer(T* ptr) { … }
private:
template<> // 오류!
void processPointer<void>(void*);
};
11
12. Effective Modern C++ Study
C++ Korea
class Widget {
public:
template<typename T>
void processPointer(T* ptr) { … }
};
template<>
void Widget::processPointer<void>(void*) = delete;
12
15. Effective Modern C++ Study
C++ 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
17. Effective Modern C++ Study
C++ 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
18. Effective Modern C++ Study
C++ 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
20. Effective Modern C++ Study
C++ 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
21. Effective Modern C++ Study
C++ 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
25. Effective Modern C++ Study
C++ Korea
std::vector<int> values;
std::vector<int>::iterator it =
std::find(values.begin(), values.end(), 1983);
values.insert(it, 1998);
25
26. Effective Modern C++ Study
C++ 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
28. Effective Modern C++ Study
C++ Korea
std::vector<int> values;
auto it =
std::find(values.cbegin(), values.cend(), 1983);
values.insert(it, 1998);
28
29. Effective Modern C++ Study
C++ 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
30. Effective Modern C++ Study
C++ Korea
template <class C>
auto cbegin(const C& container) -> decltype(std::begin(container))
{
return std::begin(container);
}
30