C++ - std::function

C++에 존재하는 여러 종류의 함수를 wrap 하여 똑같이 다룬다 C++에 있는 함수의 종류 함수 람다식 함수 객체 클래스의 멤버 함수 람다식 사용법 [캡처](인수)->반환 값 타입 { 함수의 내용 }(실행 시 인수); 캡처에는 기본적으로[=] 나 [&]가 들어간다. =는 범위 밖의 변수를...
더 읽기

C++ - std::bind 사용

지정한 함수를 wrap해서 std::function을 만든다. #include <iostream> void test_function(int a, int b) { printf("a=%d, b=%d\n", a, b); } int main(int argc, const char * argv[]) { auto func1 = std::bind(test_function, std::placeholders::_1, std::placeholders::_2); func1(1, 2); // -> a=1, b=2 auto func2...
더 읽기

C++ - 자주 사용하는 C++ 이디엄(idiom) Extension Member Function

C#의 확장 메소드와 같이 기존 클래스에 대해서 멤버 함수의 확장을 operator 오버로드를 구사하여 시뮬레이트 하는 idiom 이다. 예컨대 std::vector에 print 라는 모든 요소를 출력하는 확장 구성원을 만들려고 한다면 const struct Listed_print{ using result_type=void; template<class Range> void operator()(const Range& r) {...
더 읽기

C++ - idiom - Execute-Around Pointer

원문 스마트 포인터는 객체의 라이프 타임이 다한 때에 자동적으로 확보된 리소스를 삭제한다. 생성자와 소멸자, 연산자 오버 라이드를 잘 구현하였다. 이것을 응용하면 클래스의 멤버 함수가 실행될 때 특정 처리를 실행하는 스마트 포인터를 구현할 수 있다. class ExecutePointer { public: class proxy...
더 읽기

C++ - idiom - Erase-Remove

원문 아래는 STL의 컨테이너에서 특정 요소를 삭제하는 코드. std::vector<int> a; /*a에 요소를 추가하는 코드는 생략*/ std::remove(a.begin(), a.end(), 100); 이것으로 사라진 것이 아니다. 실은 remove 함수는 특정 요소를 컨테이너의 뒤에 만든 후 선두의 특정 요소에 대한 반복문을 반환하기만 한다. 정말로 지우려면...
더 읽기

C++ - idiom - Construction Tracker

원문 생성자에서 멤버 초기화 때 예외가 발생하는 경우가 있더. try와 catch로 예외를 잡을 수는 있지만 때로는 아래와 같이 어디에서 예외가 발생했는지 알 수 없을 때가 있다. class A { public: A(int n) { /* 초기화에 실패해서 예외를 던진다 */ throw...
더 읽기

C++ - idiom - Construct on First Use

원문 정적 오브젝트는 주의하지 않으면 초기화 되기 전에 사용하는 실수를 할 수 있다. 아래는 그 예이다. #include <iostream> class StaticObject { public: StaticObject() { std::cout << "StaticObject::StaticObject()" << std::endl; } void callMethod() { std::cout << "StaticObject::callMethod()" << std::endl; } };...
더 읽기

C++ - 자주 사용하는 C++ 이디엄(idiom) Coercion by Member Template

클래스 B가 A에서 파생되어 B 타입 객체에 대한 포인터는 A 타입의 포인터에 대입할 수 있지만 이들 타입의 복합 타입은 바탕이 된 타입의 관계를 공유하지 않는다. 예를 들면 template_class는 template_class에 대입할 수는 없다. class A{}; struct B:A{}; template<class T> class template_class{};...
더 읽기