검색결과 리스트
Programming에 해당되는 글 19건
- 2010.01.01 The D Programming Language
- 2009.05.06 [TMP] chapter 2
- 2008.11.28 간단한 TMP 계산기
글
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++버리고 갈아탈만도 할듯..
설정
트랙백
댓글
글
이런 컴파일 시간 개체들도 런타임의 값을 이용하는 함수처럼, 컴파일 시간에 확정되는 함수같은것이 있다. 이런 함수를 메타함수(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로 구현한것.
RECENT COMMENT