반응형

프로그래밍 일반/C++ 프로그래밍 17

[C++] 유용한 C++ 기능 - attribute specifier

C++11부터 도입된 attribute specifier(속성 지정자)는 코드의 컴파일러에 대한 추가 정보를 제공하는 데 사용됩니다. 이를 통해 개발자는 특정 컴파일러에 맞춰진 속성을 지정하거나, 코드에 대한 최적화 및 다른 목적으로 사용자 정의 속성을 추가할 수 있습니다. Attribute specifier는 대괄호 [[와 ]]로 묶여진 형태로 사용됩니다. 아래는 attribute specifier의 간단한 예제입니다: [[noreturn]] void SomeFunc() { ... return;// 함수 내부에 리턴문이 있으면 컴파일 에러가 발생합니다. // 중간에 리턴문으로 인해 의도하지 않게 함수의 모든 코드를 // 실행할 수 없는 상황을 막는데 용이합니다. ... } [[nodiscard]] bo..

[C++] 유용한 C++ 기능 - brace initialization

기본 초기화의 문제점 // #1. 멤버 변수 배열은 초기화할 수 있는 방법이 없다. struct A { int arr[100]; }; // #2. POD 동적 할당을 초기화할 수 있는 방법이 없다. char* buff = new char[100]; // #3. STL 컨테이너를 초기화할 수 없다. std::vector vec; // #4. 타입에 따라 초기화 구문이 일관적이지 않다. int i(10); // 10으로 초기화 A a(); // a는 기본 생성자로 초기화?? A 타입을 리턴하는 함수 선언?? C++11에서 도입된 중괄호 {}를 사용한 초기화 방식을 "brace initialization" 또는 "uniform initialization"이라고 부릅니다. int myInt = 42; // 기존..

[C++] 유용한 C++ 기능 - structured binding

C++17에서 도입된 structured binding은 복합적인 데이터 구조를 손쉽게 풀어낼 수 있는 기능을 제공합니다. 이를 통해 배열, 튜플, 구조체 등에서 멤버를 간단하게 추출하여 사용할 수 있습니다. Structured binding은 다음과 같은 문법을 사용합니다: auto [변수1, 변수2, ...] = 표현식; 여기서 표현식은 풀어낼 데이터 구조를 나타내며, 변수1, 변수2 등은 구조체나 튜플의 각 요소에 대응됩니다. 예를 들어, 튜플을 사용한 structured binding은 다음과 같이 보입니다: #include #include int main() { std::tuple myTuple(42, 3.14, "Hello"); auto [a, b, c] = myTuple; std::cout

[C++] 유용한 C++ 기능 - if / switch init statement

if / switch init statement 로컬 변수의 생명주기가 블럭과 같도록 합니다. if 문 이후에 x 변수가 잘못 사용되는 위험을 방지하고 코드의 의도를 명확히 합니다. if (int x = getX(); x > 0) { // x가 0보다 큰 경우에 실행되는 코드 // x를 여기서 사용할 수 있음 } else { // x가 0 이하인 경우에 실행되는 코드 } 위의 예제에서 getX() 함수는 변수 x를 초기화하는데 사용됩니다. 이렇게 하면 if 블록 내에서만 x가 유효하게 됩니다. 다음은 switch에서 사용하는 예시입니다. switch (int value = getValue(); value) { case 1: // value가 1인 경우에 실행되는 코드 break; case 2: // va..

[C++] std::function

C++11표준 라이브러리의 한 템플릿으로, 함수 포인터 개념을 일반화한 것입니다. 함수 포인터는 함수만 가리킬 수 있지만 std::function은 호출 가능한 객체이면 그 어느 것도 가리킬 수 있습니다. 즉, 함수 처럼 호출 할 수 있는 것이면 그 무엇이라도 std::function으로 가리킬 수 있습니다. 예를 들면 함수, operator(), 람다 함수들이 있으며 다음은 그 예시입니다. int sum(int a, int b) { return a + b; } struct Sum { int operator()(int a, int b) { return a + b; } }; int main() { std::function s1 = sum; std::function s2 = Sum(); std::functi..

[C++] Closure(클로저)

Closure? Lexical binding을 지원하는 함수형 언어로 부터 파생된 개념이며, 코드 블럭을 정의할때 스코프내의 환경들을 기억하여 나중에 수행될 때도 원래의 환경에 따라 수행되는 것을 말합니다. 람다 표현식 VS 클로저 스콧 마이어(Scott Meyers)는 "람다와 클로저의 차이는 클래스와 클래스 인스턴스 사이의 차이점과 동일하다"라는 좋은 예를 들었습니다. 클래스는 오직 소스 코드에만 존재하며 런타임에 존재하지 않습니다. 클래스 인스턴스만이 런타임에 존재합니다. 즉, C++에서는 람다 표현식이 인스턴스화 된 것을 클로저라 합니다. 클로저의 예 #include #include std::function closureWrapper1() { int x = 10; return [x](){std::..

[Effective Modern C++] 항목 4: 연역된 형식을 파악하는 방법을 알아두라

형식 연역의 결과를 직접 확인 하는 수단으로서 코드를 작성/수정하는 시점에서, 컴파일 시점에서, 실행 시점에서 형식 연역 정보를 얻는 방법을 살펴보겠습니다. IDE 편집기 IDE의 코드 편집기 중에서 프로그램 개체(변수, 매개변수, 함수 등) 위에 마우스 커서를 올리면 그 개체의 형식을 표시해 주는 것이 많습니다. const int theAnswer= 42; auto x = theAnswer; auto y = &theAnswer; IDE 편집기는 x의 연역된 형식이 int이고 y의 연역된 형식이 const int*임을 표시해 줄 것입니다. 컴파일 가능 상태여야 편집기에서 요청된 개체의 형식을 표시 할 수 있을 것입니다. 간단한 경우에는 IDE가 알려준 정보가 쓸만합니다. 그러나, 복잡한 형식에서는 그리고..

[Effective Modern C++] 항목 3: decltype의 작동 방식을 숙지하라

decltype은 주어진 식의 구체적인 타입 그대로 전달하는(추출하는) 키워드입니다. 대부분은 예측한 형식 추출되지만 가끔씩 그렇지 않은 경우가 있습니다. decltype 과 auto에 관한 설명을 참고해주세요.decltype의 일반적 쓰임먼저 decltype의 명확한 경우들을 살펴봅시다.const int i = 0; // decltype(i)는 const int bool f(const Widget& w) // decltype(w)는 const Widget& // decltype(f)는 bool(const Widget&) struct Point{ int x; // decltype(Point::x)는 int int y; // decltype(Point::y)는 int }; Widget w; // declt..

[Effective Modern C++] 항목 2: auto의 형식 연역 규칙에 숙지하라

항목 1에서 템플릿 형식 연역을 알고 있다면 auto 형식 연역에 관해 알아야 할 것은 거의 알고 있는 셈입니다. 예외를 빼면 auto 형식 연역이 곧 템플릿 형식 연역이기 때문입니다. auto를 이용해서 변수를 선언할 때 auto는 템플릿의 T와 동일한 역할을 하며, 변수의 형식 지정자(type specifier)는 ParamType과 동일한 역할을 합니다. (T, ParamType이 무엇인지 모른다면 항목 1을 살펴봐주세요.) auto x = 27; // x의 형식 지정자는 auto const auto cx = x; // cx의 형식 지정자는 const auto const auto& rx = x; // rx의 형식 지정자는 const auto& 이 예들에서 x와 cx, rx의 형식들을 연역할 때, 컴..

반응형