본문 바로가기

Programming/CPP11&14

[C++11] std::pair를 확장한 std::tuple Boost에 존재하던 tuple이 C++ 표준으로 채택되었습니다. C++ TR1부터 사용이 가능해졌지만 C++11에 분류한 것은 이전에 작성한 가변인자 템플릿때문입니다. tuple은 기존의 std::pair를 확장한 자료형입니다. std::pair가 2개의 값을 한 번에 저장할 수 있지만 tuple은 제한이 없습니다. 기존의 C++ TR1에서는 10개까지 저장이 되었습니다. tuple은 2개 이상의 값을 한 번에 반환하거나 전달할 때 사용하면 유용합니다. 물론 구조체를 통해서 가능한 방법이긴 하지만 구조체는 정의를 해서 사용해야 합니다. tuple을 이용하면 간단하게 다양한 값들을 한 번에 전달이 가능하게 됩니다. 예제 코드는 다음과 같습니다. #include #include #include int ma.. 더보기
[C++11] 가변인자 템플릿을 위한 sizeof... 연산자 가변인자 템플릿의 지원으로 템플릿을 작성하는 것이 더 편리하게 되었습니다.C++11의 가변인자 템플릿에 대한 설명은 아래 링크를 통해서 참조할 수 있습니다.2015/03/05 - [Programming/C++11&14] - [C++11] 가변인자 템플릿(Variadic Templates)가변인자 템플릿이 추가되면서 sizeof...연산자가 추가되었습니다.sizeof...은 기존의 sizeof와는 약간 다른 기능을 합니다.sizeof...은 파라미터 팩의 수를 가져오는 역할을 합니다.가변인자로 넘어온 파라미터를 파라미터 팩이라고 하는데 ...이 실제 몇 개의 인자인가 알 수 있습니다.이전 가변인자 템플릿의 예제를 가져와서 조금 수정해 보도록 하겠습니다. #include using namespace std;.. 더보기
[C++11] 가변인자 템플릿(Variadic Templates) C와 C++에는 가변인자 함수가 존재합니다....이라는 생략 부호를 사용하는 특이한 형태의 함수입니다.C/C++에는 대표적인 가변인자 함수인 printf가 존재합니다. 가변인자 함수에 대해서는 아래의 링크를 참조하시면 됩니다.2014/12/07 - [Programming/C&C++] - 가변 인자 함수의 사용법(vprintf, vsprintf)2014/12/07 - [Programming/C&C++] - 가변 인자(Variable Arguments) 내부 구조C++11에는 가변인자를 템플릿에도 적용이 가능하게 되었습니다.가변인자 템플릿은 다음과 같은 형식으로 되어 있습니다. template returntype functionname(Arguments... args); template class class.. 더보기
[C++11] static_assert를 통한 컴파일 타임 검증 static_assert는 컴파일 타임에 소프트웨어 assertion을 위해서 추가된 문법입니다. 만약 작성된 constant-expression이 false(거짓)일 경우에 컴파일러는 메시지를 출력하고 C2338 에러를 출력합니다. 만약 true라면 아무런 영향도 발생하지 않습니다. 이미 C++에는 #error 전처리기 지시자와 assert 매크로를 통해서 assertion 처리가 가능합니다. 다만 C++의 assert는 런타임에 비교를 수행하기 때문에 성능의 하락을 가져올 수 있는 단점이 있습니다. 컴파일 타임에 해당하는 문제를 더 빨리 찾아내는 것이 모든 면에서 더 낫다고 할 수 있습니다. #error의 경우는 컴파일 타임에 처리가 가능합니다. 다만 템플릿이 구체화되기 전에 수행되버리기 때문에 템플.. 더보기
[C++11] default와 delete 키워드 C++의 클래스는 기본적으로 다음의 특수한 멤버 함수를 생성합니다.기본 생성자 복사 생성자 복사 대입 연산자 소멸자클래스를 생성하고 아무것도 하지 않아도 위의 4개는 기본적으로 생성됩니다.이것으로 클래스는 기본적으로 아무것도 추가하지 않아도 생성, 복사, 소멸이 가능해집니다.C++11에서는 기본적으로 생성되는 특수 멤버 함수에 무브 생성자와 무브 대입 연산자가 추가되었습니다.이 특수한 멤버 함수들을 명시적으로 선언하면 다음과 같은 규칙이 발생합니다.1. 어떤 생성자(복사 생성자 포함)가 명시적으로 선언된 경우 기본 생성자는 자동적으로 생성되지 않는다.2. 가상 소멸자가 명시적으로 선언된 경우 기본 소멸자가 자동적으로 생성되지 않는다.3. 무브 생성자나 무브 대입 연산자가 명시적으로 선언된 경우 1) 복사.. 더보기
[C++11] 새로운 스마트 포인터 unique_ptr(auto_ptr의 대체) C++11에서 auto_ptr이 사라지고 unique_ptr이 새로 추가되었습니다.auto_ptr의 문제점에 대해서는 아래의 글을 확인하시면 됩니다.2014/12/08 - [Programming/C&C++] - 스마트하지 못한 스마트한 포인터 auto_ptrauto_ptr을 대체하는 unique_ptr에 대해서 알아보도록 하겠습니다.unique_ptr은 auto_ptr과 거의 유사한 멤버를 가지고 있습니다.동적 할당된 포인터를 받아서 해당 포인터를 핸들링하고 자동으로 메모리를 해제하는 역할까지 동일합니다.* 연산자나 -> 연산자도 auto_ptr과 동일하게 지원합니다.unique_ptr을 생성하는 코드를 보도록 하겠습니다. #include #include #include struct TestStuff {.. 더보기
[C++11] cbegin()과 cend(), crbegin()과 crend() C++의 STL 컨테이너들은 Iterator(반복자)를 통해서 내부에 있는 데이터의 한 위치를 가리킬 수가 있습니다.Iterator의 종류는 Input, Output, Foward, Bidirectional, Random Access로 구분할 수 있습니다.Input과 Output은 각각 출력과 입력만을 담당하는 최소한의 기능을 가지고 있는 Iterator입니다. Foward의 경우는 순방향 Iterator로 한 쪽으로(처음 -> 끝) 이동하는 Iterator입니다.Bidirectional은 이름 그대로 양방향으로 이동이 가능한 Iterator입니다.Random Access는 랜덤하게 한 곳을 콕 찝어서 이동이 가능한 Iterator입니다.Input -> Foward -> Bidirectional -> R.. 더보기
[C++11] final과 override C++에서는 명시적으로 클래스의 상속을 막는 방법이 없었습니다.C++ CLI 등에서 selaed라는 키워드가 존재했지만 이것은 표준이 아닌 MS 확장 키워드입니다.C# 역시 sealed라는 키워드를 사용합니다.C#의 sealed 키워드에 대한 내용은 다음 링크에서 확인 가능합니다.2014/12/27 - [Programming/C#] - sealed 키워드를 사용한 클래스 상속 방지C++ CLI나 C#이나 모두 닷넷을 지원하기 위해서 만들어진 것을 생각하면 공통된 특정 키워드가 있는 것이 이해가 갑니다.C++11에서는 상속을 정교하게 다루기 위해 final과 override라는 새로운 키워드가 추가되었습니다.final은 상속을 차단하기 위해 추가된 키워드이고, override는 클래스의 메소드를 명시적으로.. 더보기