분류 전체보기
-
[Effective Modern C++] auto와 std::vector, 그리고 Proxy patternC++/Effective Modern C++ 2022. 2. 14. 16:10
이전 글(auto의 사용을 고려해야 할 상황들) 에서 auto를 사용함으로써 이점이 명확한 예제들을 살펴보았습니다. 그런데, auto는 형식 연역을 사용하기 때문에 초기치가 잘못되었을 경우, 의도하지 않은 형식으로 연역될 가능성이 존재합니다. 이번 글에서는 한 예제를 살펴보며 원하지 않는 형식으로 연역되는 상황과, 그런 상황에 대한 해결법 한가지를 살펴보도록 하겠습니다. 예제를 살펴보도록 하겠습니다. class Widget; std::vector features(const Widget& w); Widget w; bool high_priority = features(w)[5]; process_widget(w, high_priority); //Do something 위 코드의 각 함수, 클래스는 다음과 같습..
-
[Effective Modern C++] auto의 사용을 고려해야 할 상황들C++/Effective Modern C++ 2022. 1. 10. 16:06
auto는 C++11에서 추가된 변수의 한 종류로써 선언과 동시에 초기화를 해야 하며, 초기화에 사용된 식에 따라 형식이 결정되는 변수입니다. 이처럼 개념적으로는 매우 간단하지만, 파고들수록 미묘한 구석이 있는 변수입니다. 초기화에 사용된 식의 형식을 그대로 가져가는 것이 아니라, 특정 규칙에 따라 형식이 결정되어 무턱대고 사용하면 원하지 않는 결과가 나오는 경우도 종종 발생합니다. 하지만, auto는 사용을 통해 얻는 이득이 명확한 용법입니다. 이번 글에서는 auto에 대해서 살펴보도록 하겠습니다. 1. auto의 선언 및 초기화 더보기 auto는 선언과 초기화를 동시에 해 주어야 합니다. 아래와 같이 선언만 했을 경우 컴파일이 되지 않습니다. int main() { auto a; auto b(1); ..
-
[Effective Modern C++] Type deduction : typeid, boost/type_indexC++/Effective Modern C++ 2022. 1. 6. 12:42
형식 연역 (Type deduction)은 소스코드에서 특정한 코드가 어떤 것으로 바뀌는 것 입니다. 여기서 '특정한 코드'란 template, auto, decltype 등 이 있으며 바뀌게 되는 '어떤 것' 에는 자료형부터, 함수, 람다식 등이 있습니다. 이전 글에서 template과 auto, 그리고 decltype을 통한 컴파일러에 의한 형식 연역을 살펴보았습니다. 컴파일러가 어떤 규칙을 통해 형식 연역을 수행하는지 아는 것도 중요하지만 그것을 확인하고 검증해야 하는 수단도 필요할 때가 있을 것 입니다. 이번 글에서는 연역된 형식을 파악하는 방법을 알아보도록 하겠습니다. 1. IDE 편집기 더보기 대부분의 IDE 편집기는 마우스 커서를 올리면 그 개체의 형식을 표시해 주는 기능이 있습니다. 다음 ..
-
[Effective Modern C++] Type deduction : decltypeC++/Effective Modern C++ 2022. 1. 4. 14:12
형식 연역 (Type deduction)은 소스코드에서 특정한 코드가 어떤 것으로 바뀌는 것 입니다. 여기서 '특정한 코드'란 template, auto, decltype 등 이 있으며 바뀌게 되는 '어떤 것' 에는 자료형부터, 함수, 람다식 등이 있습니다. 이전 두 글에서, template과 auto의 형식 연역 과정을 살펴보았습니다. 두 키워드 모두 몇 가지의 특이사항만 제외한다면 동일한 규칙이 적용됨을 알 수 있었습니다. decltype은 이전 두 키워드와는 조금 다른 방식의 연역이 적용됩니다. 이번 글에서는 decltype에 대하여 알아보도록 하겠습니다. decltype은 형식 지정자 키워드입니다. 기본적인 사용은 아래와 같습니다. const int i = 0; bool f(const int& p..
-
[Effective Modern C++] Type deduction : autoC++/Effective Modern C++ 2021. 12. 27. 15:41
형식 연역 (Type deduction)은 소스코드에서 특정한 코드가 어떤 것으로 바뀌는 것 입니다. 여기서 '특정한 코드'란 template, auto, decltype 등 이 있으며 바뀌게 되는 '어떤 것' 에는 자료형부터, 함수, 람다식 등이 있습니다. 이전 글에서, template에 대한 형식 연역을 살펴보았습니다. 몇 가지 예외를 제외하면, 특정한 규칙에 따라 연역이 직관적으로 이루어짐을 볼 수 있었습니다. auto는 template과 유사합니다. 한 가지 경우만 제외하면, template와 동일하게 연역됩니다. 이번 글에서는 auto의 형식 연역에 대하여 살펴보도록 하겠습니다. 함수 템플릿은 일반적으로 아래와 같이 표현되고, 호출됩니다. //Declaration template void fun..
-
[Effective Modern C++] Type deduction : TemplateC++/Effective Modern C++ 2021. 12. 21. 09:27
형식 연역 (Type deduction)은 소스코드에서 특정한 코드가 어떤 것으로 바뀌는 것 입니다. 여기서 '특정한 코드'란 template, auto, decltype 등 이 있으며 바뀌게 되는 '어떤 것' 에는 자료형부터, 함수, 람다식 등이 있습니다. 형식 연역은 특정한 규칙에 의거하여 이루어집니다. 개발자가 추론한 것과 컴파일러가 실제로 연역한 것이 다를 수 있기 때문에, 이 규칙을 확실히 이해해야 합니다. 귀찮고, 복잡하다고 안 쓰기에는 template과 auto는 굉장히 유용한 기능이기 때문입니다. 이번 글에서는 template의 형식 연역에 대하여 살펴보도록 하겠습니다. 함수 템플릿은 보통 아래와 같은 형태로 선언되고, 호출됩니다. //Declaration template void func..
-
[C++] 람다 표현식C++/이것이 C++이다 2021. 12. 6. 16:49
람다 표현식 (Lambda Expression)은 람다식 (Lambda)으로 자주 불리는 함수 선언 방식입니다. 람다식은 이전 글(함수)에서 살펴본 함수 객체, 함수 포인터와 유사하게 함수를 전달하는 데 주로 사용됩니다. 람다식은 다음과 같은 형태로 구성됩니다. [] () mutable throw() -> int { int a; a++ return a; } [] : Capture clause, Labmda introducer라고 합니다. 람다식 외부 변수에 접근하기 위해 사용합니다. () : Parameter list입니다. 파라미터가 없을 경우 생략 가능합니다. mutable : Capture를 통해 참조, 복사 한 외부 변수의 상수성을 제거하는 데 사용됩니다. 필요한 경우에만 기술하는 속성입니다. t..
-
[C++] 함수C++/이것이 C++이다 2021. 11. 28. 23:45
함수는 이전 글(함수 기본)에서도 다루었던 주제입니다. 지난 글에서는 함수 그 자체의 기능 (디폴트 파라미터, 인라인 등...)에 대해 다루었습니다. 이번 글에서는 함수를 객체지향적으로 다루는 것과 관련이 있는 기능에 대해 살펴보도록 하겠습니다. 1. 함수 포인터 더보기 포인터는 주소를 저장하는 변수 입니다. 그리고, 이 주소에는 함수 또한 포함됩니다. 함수 또한 변수와 마찬가지로 자기만의 주소를 가지고 있습니다. 포인터를 통해, 함수의 주소를 가리키고 사용하는 것이 가능합니다. 예제를 살펴보겠습니다. #include using namespace std; int test_func() { return 12; } int main() { int (*func)() = test_func; cout