본문 바로가기

반응형

template

(12)
[C++] 템플릿 특화(Template specialize) 완벽 가이드 템플릿 특화란? C++은 하나의 코드로 다양한 타입에 대응할 수 있는 템플릿이라는 도구를 제공한다. 이 글을 읽는 여러분은 이미 템플릿에 대해서는 알고 있다고 가정하고, 이번 포스트에서는 템플릿 특화(Template specialization)에 대해 살펴 보도록하낟. 템플릿 특화(Template specialization)는 특정 타입의 템플릿 인자에 대응하는 특별한 템플릿 클래스를 정의할 수 있는 기능이다. 참고로 템플릿 특화는 템플릿 특수화라고도 번역 되며 특화나 특수화나 같은 의미니 다른 곳에서 특수화라고 표현되는 글을 본다고 하더라도 당황하지 말도록 한다. 설명을 위해 우선 아래 일반 템플릿 클래스의 예제 코드를 살펴 보도록 하자. 아래에서는 템플릿 인자로 T와 U를 받을 수 있는 Widget이..
[C++] C++에서 C# delegate 만들기 Delegate란? 사전적 의미의 delegate는 '대리자'로써 뭔가를 대신 해준다는 의미고, C#에서의 delegate는 일종의 콜백 함수'리스트'로써 입력과 출력이 동일한 함수들을 일괄 호출하는데 사용된다. 이게 C++ 관점에서 보면 함수 포인터 리스트를 들고 있는 간단한 클래스 정도인데, 개념적으로도 어렵지 않고 구현하는 것도 그렇게 어렵지 않다. 말 그대로 함수 포인터 리스트를 만들어도 되고, 인터페이스 클래스를 정의하고 그걸 상속 받은 클래스 리스트를 만들어도 된다. 다만...필요할때 마다 매번 만드는게 은근 귀찮아 template과 operator overriding을 이용하여 재사용 가능한 delegate 클래스를 만들어 보도록 하겠다(c++ 11 이상). C# Delegate의 인터페이스..
[C++] 'template' 키워드를 한정자로 사용하기 템플릿 멤버 함수를 특별하게 구분해야 할 필요가 있는 경우 한정자로써 'template' 키워드를 사용한다. 아래 예제 코드를 보고 언제 'template' 키워드를 한정자로 사용해야 하는지 살펴보자 class A { public : template T function_m() {}; }; template void function_n(U argument) { char object_x = argument.function_m(); } 위 예제에서, 컴파일러는 템플릿 인자 U가 클래스 A의 인스턴스라는 것을 추론하지 못하기 때문에 'function_m'이 템플릿 멤버 함수라는 것을 알지 못하고 '
[C++11] Variadic template(Parameter pack) Variadic template C++에서는 Parameter pack이라고 불리며, 수가 정해지지 않은 N개의 인자를 사용 할 수 있는 기능으로써 D언어와 C++ 11에서 지원하고 있다 en.cppreference.com/w/cpp/language/parameter_pack Parameter pack(since C++11) - cppreference.com A template parameter pack is a template parameter that accepts zero or more template arguments (non-types, types, or templates). A function parameter pack is a function parameter that accepts zero..
error: too few template-parameter-lists " error: too few template-parameter-lists"는 신규 버젼 gnu cpp 컴파일러에서 발생하는 에러다. 이 문제는 템플릿 클래스의 static 멤버 변수를 초기화 할 때 발생하며, 해결을 template을 static 멤버 변수 초기화 코드 앞에 붙여 주어야 한다. 예를 들어 : template class A { static int a; static const char * const name; }; 와 같은 코드가 있다고 해보자. 예전에는 아래와 같이 써도 무방했다 : int A::a = 0; const char * const A::name = NULL; 하지만 위와 같은 코드는 CeePlusPlus 표준에 의해 이제는 더 이상 유효한 코드가 아니며 "" error: too..
템플릿(template)을 이용한 에러객체 만들기 ♥ 에러 객체란? " 에러객체 = 에러코드 + 에러문자열 " 프로그래밍을 하다보면 종종 에러코드를 정의해서 써야하는 경우가 있다. 종종이라기보다는 항상 에러코드를 정의해야한다. C++을 사용하는 나의 경우에는 enum을 주로 이용하여 에러코드가 겹치는 것을 방지하고, 다른 언어를 사용하는 사람들도 각자의 언어에서 제공하는 여러가지 방법을 사용하여 에러 코드를 정의해 쓸 것이다. 이렇게 에러코드들을 주루룩 정의해서 쓰다보면 한가지 아쉬운 점이 꼭 생각난다. "에러 코드만 넣으면 무슨 에러인지 알수 있는 방법은 없을까?" 오늘 소개해볼 '에러 객체'라는 것은 위의 불편함을 조금이라도 해결해 보기 위해 만들어진 몸부림 중에 하나다. ♥ 에러 객체에게 필요한 것들? 중복은 절대 안되!! 에러 코드는 중복되어서는..
템플릿 특화를 이용한 멀티 키 맵(Multi Key Map) 이전에 템플릿 특화(template specialization)와 특화를 이용한 튜플(Tuple)클래스를 만들어 본적이 있다. 오늘은 비슷한 원리를 이용해 N개의 키를 가질 수 있는 멀티 키 맵을 만들어 보겠다. 멀티키 맵이라고 해서 특별이 다를 것은 없다. 다만 단일 키만을 제공하는 std::map을 좀 더 확장하여 N개의 키를 타입 리스트를 통해 넘겨주는 것 뿐이다. 물론 이런 방법 말고도 구조체를 키로 쓰는 std::map을 활용하거나, 바이너리 메모리로 모든 키들을 복사해서 쓰는등 구현에는 다향한 취향과 트레이드 오프가 존재한다. 오늘 이 포스트에서 소개하는 것은 그 방법들 중 한 가지 방법일 뿐이다. 멀티키 맵에 관련된 설명에 앞서 이전에 다뤘던 Typelist라던지 템플릿 특화의 개념은 이미 ..
템플릿(template) FAQ - Visual Studio 6.0 Bugs 템플릿의 세계에 빠져 살던 요즘.. 동일한 코드가 어디서는 정상적으로 돌아가고, 어디서는 이상동작을 한다거나, 컴파일이 안 되는 경우가 있는데요.. 찾아보니 Visual studio의 버그로 인한 것도 있더군요. 7.0에서는 패치되었다고는 하지만…6.0도 분명히 돈 받고 팔던 것인데…오류 사항이 있으면 패치를 할 생각을 안하고 다음 버전에서 때우다니 은근히 맘에 들지 않는군요. http://womble.decadentplace.org.uk/c++/template-faq.html
템플릿 특화를 이용한 튜플 클래스 'Modern C++ Design'에서 소개되고 있는 튜플(Tuple)이라는 개념은 일종의 레코드로써 우리가 일반적으로 생각하는 구조체라고 생각하면 된다. 단 구조체는 만들 때 마다 멤버 변수의 이름이나 구조체의 이름을 지정해 줘야 하지만 '그것것에 대해 신경 쓸 필요가 없는.. 다시 말하면 '이름없는 구조체'를 튜플이라고 하고 있다. 어디에 쓰는지야 각자 프로그램을 만들면서 살다 보면 스스로 알게 될 것이고, 이번 포스트에서는 템플릿 특화(Template specialize) 를 이용한 튜플 클래스 구현에 대해서 알아 보겠다. Tuple 클래스의 기본적인 개념은 '상속'이다. 클래스 Derived가 클래스 Base를 public으로 상속 한다고 생각해 보자. 이런 경우 Derived는 Base의 모든 ..
[C++] BTree 구현 완료 Insert split delete merge search 미구현 iterate 잠이 오긴 하지만 잠시 생각 해보자. Btree는 iteration이 상당히 까칠하다. 그럼 list를 추가하면 될듯한데..그럼 키는 트리에 유지하고 값만 리스트에 저장 하면 되겠군. 그런데 문제는 트리가 다시 밸런스를 맞추면서인데..예를 들어 2:2가 들어 오고 3:3이 들어 오고 1:1이 들어 오면 3이야 뒤에 추가 하면 되니 아무런 문제가 없지만 1:1은 2보다 작다는 것을 알 수 있으니까 2의 iterator 앞에 넣어 주면 되겠군. 대충 돌아 갈 수 있을 것 같구먼 erase 소스 코드 : 티스토리 버그인지 모르겠으나 코드 라인 정렬이 계속 깨져 파일을 따로 업로드 한다. #pragma once #prag..

반응형