C++을 사용하다가 뭔가 불편하다 싶은것들은 대충 다 있다.


Delegate도 있고 Garbage Collector도 있고 근데 pointer도 있다. ㅎㅎ. Template도 있고.. 큭히나 C++0x에서 추가하기로 했다가 결국 못한 concept개념이 constraint라고 해서 들어가있다. 무려 다음과 같은게 가능

1.  bool isprime(int n)   

2.  {   

3.      if (n < 1 || (n & 1) == 0)   

4.      return false;   

5.      if (n > 3)   

6.      {   

7.      for (auto i = 3; i * i < n; i += 2)   

8.      {   

9.          if ((n % i) == 0)   

10.         return false;   

11.     }   

12.     }   

13.     return true;   

14. }   

15.   

16. template Foo(int N)   

17.     if (isprime(N))   

18. {   

19.     ...   

20. }   

21.   

22. Foo!(5)    // ok, 5 is prime   

23. Foo!(6)    // no match for Foo  

무려 컴파일타임에 되는것임 ㄷㄷㄷ

그러니까 그냥 할수 있는건 C++하고 마찬가지인데, 편하긴 더 편하다.

그러니까 pImpl같은 귀찮은 구현도 별로 필요 없고 Exception처리할때 객제자체가 왔다갔다 하는것도 안해도 되고 하여간 좋은듯

제일좋은건 C함수 그대로 쓸 수 있다. WINAPI같은거 그냥 쓸수 있음 ㅋㅋ

C++버리고 갈아탈만도 할듯..




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
이것을 보자.

C++의 또다른 매력 TMP


#include <iostream>
//TMP
template <bool cond, typename T1, typename T2> struct IF{};
template <typename T1, typename T2>
struct IF<false, T1, T2>{
 typedef T2 type;
};
template <typename T1, typename T2>
struct IF<true, T1, T2>{
 typedef T1 type;
};
template <typename T, typename U>
struct Typelist{
 typedef T hd;
 typedef U tl;
};
struct NullType{};
template<int n>
struct NUM{
 enum {val=n};
};
template<typename expr1, typename expr2>
struct PLUS{
 enum {val=expr1::val+expr2::val};
};
template<typename expr1, typename expr2>
struct MINUS{
 enum {val=expr1::val-expr2::val};
};
template<typename expr1, typename expr2>
struct MULT{
 enum {val=expr1::val*expr2::val};
};
template <typename exprlist>
struct MAX{
 enum {val=IF<(exprlist::hd::val > MAX<typename exprlist::tl>::val),
  typename exprlist::hd,
  MAX<typename exprlist::tl> >::type::val};
};
template<>
struct MAX<NullType>{
 enum {val=0};
};
int main(){
 std::cout <<
  PLUS<
   NUM<10>,
   MAX<
    Typelist<
     NUM<20>,
     Typelist<NUM<10>, NullType >
     >
    >
   >::val;
 return 0;
}

사실은 프로그래밍 원리의 nML숙제를 TMP로 구현한것.