Notice
Recent Posts
Recent Comments
Link
- 책_곽용재님 홈페이지
- 책_노란북 - 책 가격비교
- 책_김재우-SICP번역
- 플밍_쏘쓰포지
- 플밍_CodingHorror ?
- 플밍_상킴
- 플밍_김민장님
- GPGStudy
- 플밍_미친감자님
- 플밍_jz
- 플밍_샤방샤방님
- 플밍_글쓰는프로그래머2
- 플밍_키보드후킹
- 사람_재혁
- 사람_kernel0
- 사람_박PD
- 사람_경석형
- 사람_nemo
- 사람_kikiwaka
- 사람_Junios
- 사람_harry
- 사람_어떤 개발자의 금서목록..
- 사람_모기소리
- 사람_낙타한마리
- 사람_redkuma
- 사람_영원의끝
- 사람_민식형
- 도스박스 다음카페
- 플레이웨어즈 - 게임하드웨어벤치마크
- http://puwazaza.com/
- David harvey의 Reading Marx's c…
- 씨네21
- 한겨레_임경선의 이기적인 상담실
- 본격2차대전만화 - 굽시니스트
- 영화_정성일 글모음 페이지
- 영화_영화속이데올로기파악하기
- 음식_생선회
- 죽력고
- 사람_한밀
- 플밍_수까락
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 소비자고발
- 태그가 아깝다
- 노무현
- 정신분석
- 일리아스
- 고전강의
- 유머
- 프로그래밍
- 건강
- 단상
- 진삼국무쌍5
- c++
- 책
- Programming
- template
- 삼국지6
- modernc++
- stl
- 삼국지
- 인문학
- 정성일
- 김두식
- 게임
- 진중권
- 강유원
- programming challenges
- 고등학교 사회공부
- 유시민
- 영화
- BSP
Archives
- Today
- Total
01-07 02:28
lancelot.com
Empty class and Tag dispatching 본문
- Tag dispatching
- empty class 를 이용해서 함수 오버로딩을 설명적인 코드로 만드는 테크닉
- tag dispatching 에 사용되는 empty class 를 tag_type이라고도 함
- Tag dispatching 예시 1
#include<iostream>
#include<mutex>
struct adopt_lock_t
{
explicit adopt_lock_t() = default;
};
constexpr adopt_lock_t adopt_lock;
template<class Mutex>
class lock_guard
{
public :
using mutex_type = Mutex;
explicit lock_guard(Mutex& mtx) : mtx(mtx) { mtx.lock();}
explicit lock_guard(Mutex& mtx, adopt_lock_t) : mtx(mtx) { }
~lock_guard() noexcept { mtx.unlock(); }
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
Mutex& mtx;
};
std::mutex m1,m2;
int main()
{
lock_guard g1(m1);
m2.lock();
lock_guard g2(m2, adopt_lock);
// lock_guard g2(m2, {} ); adopt_lock_t = {} 를 error 로 만들기 위해 생성자가 명시적으로 있어야하도록 함
}
- Tag dispatching 예시 2
#include<iostream>
#include<mutex>
std::mutex m;
int main()
{
std::unique_lock u1(m, std::adopt_lock);
std::unique_lock u2(m, std::defer_lock);
std::unique_lock u3(m, std::try_to_lock);
int* p1 = new int[10]; // 실패시 std::bad_alloc 예외 발생
delete[] p1;
int* p2 = new(std::nothrow) int[10]; // 실패시 0 반환
delete[] p2;
}
// Mutex lock 을 위한 empty class ( C++11 )
struct adopt_lock_t { explicit adopt_lock_t() = default; };
struct defer_lock_t { explicit defer_lock_t() = default; };
struct try_to_lock_t { explicit try_to_lock_t() = default; };
constexpr adopt_lock_t adpt_lock{};
constexpr defer_lock_t defer_lock{};
constexpr try_to_lock_t try_to_lock{};
// nothrow new (C++98)
struct nothrow_t { explicit nothrow_t()=default; };
nothrow_t const nothrow;
void* operator new(std::size_t sz)
{
// 실패시 throw std::bad_alloc
}
void* operator new(std::size_t sz, std::nothrow_t) noexcept
{
// 실패시 0 반환
}