본문 바로가기

컴퓨터/Modern Effective C++ 정리16

Modern Effective C++ Item 34 : std::bind 보다 람다를 쓰자 std::bind보단 람다를 쓰자.std::bind는 C++98에서 std::bind1st와 std::bind2nd 그리고 stl에서 2005년부터, 그 이전에는 TR1에서부터 쭉 많은 사람들에게 사용되었다. 그래서 누군가는 std::bind를 버리라는 말이 띠껍게 들릴지도 모른다. 하지만 C++11에서 채용된 람다는 강력한 기능들과 이해하기 쉬운 문법으로 무장하여 std::bind보다 더 좋은 선택이 되었다. 그리고 C++14에 와서는 람다는 std::bind의 완벽한 상위호환이 되었다.std::bind는 가독성이 떨어진다.std::bind보다 람다를 선호하는 가장 큰 이유중 하나는 바로 가독성이다. 시간에 맞춰 알람을 주는 함수를 만드는 예를 살펴보자.using Time = std::chrono::s.. 2015. 5. 19.
Modern Effective C++ Item 33 : 람다 forwarding엔 decltype 람다에서 std::forward 인자는 decltypec++14람다에서 가장 신통한 것은 바로 인자로 auto를 받는 generic lamdas이다. 람다에서 인자를 auto로 받는다는 것은 람다로 부터 나온 closure 클래스의 opearator( )가 템플릿이 된다고 볼 수 있다. 예를 들어 이런 auto를 인자로 받는 람다를 보자.auto f = [](auto x){ return func(normalize(x));};이 람다로 부터 나온 클로저 클래스는 다음과 같이 생겼다.class SomeCompilerGeneratedClassName{ public: template auto operator( )(T x) const { return func(normalize(x)); } ... }위 예제에서 람.. 2015. 5. 19.
Modern Effective C++ item 29 : move가 항상 좋다는 편견은 버려 move가 항상좋다는 편견은 버리자move sementic은 C++11에 등장한 큼지막한 변화의 한 축이다. 임시 객체에 대해서 Copy대신 Move를 하면 정말 번개같은 속도로 같은 기능을 대체할 수 있다고 들었던거같다. 정말로 마법같은 move의 훌륭함을 우리는 마음깊이 새기고 있었다. 하.지.만 이제는 그런 환상을 깰 시점이 온 것같다.move sementic을 지원하지 않는 경우C++ 98에 작성한 legacy 클래스들은 별도의 move 연산자들을 작성하지 않았기 때문에 move sementic으로 받아온다고 해도 별 이득을 볼수가 없다. item 27에서 보았던 move의 까다로운 자동생성조건을 생각해본다면, move 생성자 자체가 없을 가능성이 크고, 그렇다면 그냥 copy연산이 수행되기 때문.. 2015. 5. 13.
Modern Effective C++ item 28 : reference collapsing reference collapsing 이해하기item 23 에서 template parameter로 들어오는 타입이 lvalue인가, rvalue인가에 따라서 어떻게 템플릿 타입이 추론되는 지를 이야기 했다. 하지만 정확히 어떻게 universial reference가 초기화되는지는 이야기 하지 못했다. 이번 장에서 다루는 reference collapsing을 이해하면 universial reference의 초기화 방식에 대해서 정확히 알 수 있을 것이다.template 타입 추론에서 reference collapsingtemplate void func(T&& param);템플릿 인자 T의 타입 추론은 들어온 인자 param이 lvalue인지 rvalue인지에 따라서 결정된다. 이때 사용되는 결정방법은.. 2015. 5. 13.