http://www.cgal.org/

C++ 기반의 계산기하 라이브러리. 전에 컴과 졸업논문 쓰면서 했던게 이쪽 관련된거라 그때 한번 찾아보고 잊고 있었다. 전반적으로는 C++로 아주 잘 짜여진 수학 라이브러리이다. 소스도 공개되어 있으니 한번 분석해 보면 큰 도움이 될듯.
Iterators Programming/C/C++ 2010. 6. 18. 17:44
Boost Graph 라이브러리(BGL)와 STL을 사용하면서 느끼는건데...

정말 참 좋긴 한데..

정말 좋은데 ㅋㅋ

근데 사용하기가 쉽지많은 않다.

STL은 제공하는것만 사용하려면 쉬운데(typedef만 좀 해 주면) 

내가 만든 클래스도 iterator를 직접 제공하려고 하는데 이게 STL의 iterator랑 호환되게 하려면

typedef도 좀 해 줘야 하고 operator 오버로딩도 좀 해 줘야 하고

특히 copy같은 algorithm 헤더에 있는 녀석들이 사용하게 하려면

뭔가 추가할게 많다 ㅠㅠ

BGL은 사용하기는 좋은데 descriptor랑 iterator가 막 섞여서 다 까먹고 다시 보려니 

애먹고 있다. 근데 descriptor라는 발상은 좋은데 뭔가 직관적이지는 않다.

그래서 프로그램 짜다 보면 사용자층은 좀더 직관적으로 사용 할 수 있고 추상적인건 숨기게 하려니

코딩량이 좀 많아지는듯.

C++의 템플릿 기능을 최대한 이용해서, 컴파일 시간에 작동되는 프로그램을 만드는 Template Meta Programming은 실행시간의 값 같은 것을 이용하지 않고, 컴파일 시간에 확정되는 개체처럼 이용한다. 이러한, 컴파일 시간에 다룰 수 있는 개체를 메타자료(metadata)라고 한다. 메타자료는 크게 형식메타자료(Type)와 비형식(Non-type) 메타자료로 나눌 수 있다. 비형식 메타자료는 컴파일 시간 상수값을 의미하고, 형식 메타자료는 컴파일 시간에 확정되는 클래스(class of struct)를 의미한다.

이런 컴파일 시간 개체들도 런타임의 값을 이용하는 함수처럼, 컴파일 시간에 확정되는 함수같은것이 있다. 이런 함수를 메타함수(metafunction)이라고 한다. 보통, boost의 MPL에서는 메타함수는 return값을 가지는 대신 메타함수<인자>::type을 반환값으로 쓴다. 다음과 같은 것이 메타함수의 예이다.

template<class T, class R, class X>
struct composit
{
    typedef typename T::template apply<R::template apply<X>::type >::type type;
}


메타함수는 인자(템플릿의 인자)로 주어진 클래스의 가능한 프로토콜(위의 예에서는 R이 template apply<X>를 가지고 있을것) 로 실행여부가 결정된다. 같은 프로토콜을 가지고 있으면 어떤 클래스라도 인자로 쓰일 수 있다. 즉 TMP의 다형성이 구현되는 원리이다. 이것은 비단 TMP만 그런것이 아니고, 모든 템플릿 기반의 함수들의 특징이다. boost의 graph라이브러리는 이런 특징을 정말 잘 이용하고 있다.

그러면 이제 Boost Type Traits 라이브러리에 대해 알아보자. 이 Type Traits 라이브러리는 표준STL에 있는 라이브러리와 비슷하지만, 한 클래스에 여러 정보를 담은 Blob(일종의 anti-pattern이다)를 없애고 훨씬 깔끔한 형태의 메타함수라는 점이 다르다. 자세한 내용은 http://www.boost.org/doc/libs/1_39_0/libs/type_traits/doc/html/index.html
이것을 보자.