C++의 템플릿에서 인자로 쓰이는 것은 정수 아니면 자료형이다. 자료형은 class 또는 typename으로 명시해 줄 수 있으며, 이 자료형 인자는 (1) 클래스 내부의 멤버 변수의 자료형, 또는 (2) 멤버 함수의 인자나 리턴값의 자료형으로 쓰일 수 있다.

template<typename T>
class Foo {
public:
    T Bar;
};

그러니 위와 같이 생긴 클래스는 Foo<int>, Foo<char *>, Foo<RECT> 등 여러 형태로 활용할 수가 있는데,
이건 뭐지..?

Foo<int(PCSTR)> f;

이것은 int (*)(PCSTR)처럼 함수의 포인터를 지정한 것도 아니고, 일반적인 상황에서는 있을 수 없는 타입 문자열이다.
이것은 템플릿 인자에서만 허용되는 문법인데, 클래스의 멤버 함수의 프로토타입을 지정한 것이다. 이렇게 선언된 클래스에서는 Bar가 멤버 변수가 아니라 아래와 같이 호출 가능한 멤버 함수가 된다! 클래스의 형태가 완전히 달라지게 된다.

int x = f.Bar("hello, world!");

물론, Bar 함수의 몸체는 사용되는 템플릿 인자별로 모두 정의를 해 줘야 한다. 안 그러면 링크 에러가 난다.

template<>
int Foo<int(PCSTR)>::Bar(PCSTR p)
{
    return (int)p;
}

결국 멤버 함수의 인자와 리턴값이 템플릿의 인자에도 들어가고 함수 자체에도 중복 기재되는 셈이다.

Bar에 대해서 f.Bar()처럼 함수 호출이 가능하려면 Bar는 ()연산자가 오버로드되어 있는 클래스 개체이거나, 함수 포인터 타입이거나 함수 포인터로 형변환이 가능한 클래스 개체여야 한다.
그런데 그에 덧붙여 클래스 멤버 문맥에서는 위와 같은 멤버 함수 선언도 들어갈 수도 있으니, C++의 템플릿은 정말 귀에 걸면 귀걸이, 코에 걸면 코걸이가 아닐 수 없다. 심지어 virtual int(PCSTR) 같은 가상 함수 선언도 가능하다!

export 키워드가 괜히 백지화된 게 아님을 느낀다. 템플릿은 워낙 너무 방대한 언어 규격이기 때문에, 템플릿의 몸체를 다른 번역 단위로부터 끌어다 쓸 수 있으려면 템플릿으로 할 수 있는 일의 범위를 좀 더 좁혀야 할 것이다.

그런데 저렇게 멤버 함수를 완전히 customize하는 문법은, 단순히 신기한 것 이상으로 활용 방안이나 유용한 구석이 있는지 잘 모르겠다. 내가 C++ 프로그래밍을 10년이 넘게 해 왔지만, 템플릿으로 저런 것까지 가능하다는 걸 알게 된 건 1년이 채 되지 않았다.
비주얼 C++ 2003도 저게 가능할 정도이니 이건 최신 문법은 아닌 게 분명해 보인다. 그 반면 xcode에서는 이게 지원되지 않는다.

함수 개체를  함수의 인자로 전달할 때는 전통적인 함수 포인터뿐만이 아니라 C++11에서 추가된 람다 함수 오브젝트를 손쉽게 넘겨 줄 수 있다. 이때 템플릿이 아주 유용한 역할을 한다. 가령, 정렬 함수를 호출할 때 비교 함수를 익명 함수로 간단히 알고리즘을 짜서 전해 주면 되니 얼마나 편리한지 모른다.

그 반면 클래스가 함수 오브젝트를 멤버로 받는 건 아무 의미가 없고 가능하지도 않다. 그 대신 클래스 멤버가 템플릿일 때는 이것이 멤버 변수도 되고 아예 멤버 함수도 될 수 있는 자유도가 제공된다고 이해하면 되겠다.

Posted by 사무엘

2012/12/01 19:21 2012/12/01 19:21
,
Response
No Trackback , 3 Comments
RSS :
http://moogi.new21.org/tc/rss/response/763

Trackback URL : http://moogi.new21.org/tc/trackback/763

Comments List

  1. 김재주 2012/12/02 14:07 # M/D Reply Permalink

    이미 C++이란 언어는 그 자체로 너무 복잡한데다
    스크립트 언어들의 성능도 무시무시한 속도로 좋아지고 있으니 언제까지 써먹을지 싶습니다.

    제가 요즘 관심있게 보는 언어는 얼랭입니다. 간단하면서도 표현력과 성능이 모두 좋은 언어들이 많죠.

    1. 사무엘 2012/12/03 00:01 # M/D Permalink

      아무리 모바일 기기가 대세여도 PC 자체가 결코 없어질 수는 없듯이,
      C++도 차지하는 비중이 줄어들기만 할 뿐, 아마 없어지지는 않을 겁니다.
      네이티브 코드 생성 지향 언어로서는 가히 독자적인 지위를 차지하고 있잖아요?

      다만, 획기적인 새로운 표준에 의해 C++ 자체의 모습이 훗날 확 달라질 가능성은 있을 것 같습니다. 예를 들어 #include 대신 언어 차원에서 패키지 규격이 추가된다거나. ㄲㄲㄲ

  2. 김재주 2012/12/07 20:21 # M/D Reply Permalink

    근데 결국 다른 언어들이 C++의 성능마저 따라잡는 날이 어느 순간엔가는 올 거거든요.
    지금도 어지간한 언어는 LLVM을 통해 최적화된 네이티브 코드를 생성할 수 있고요. (C++ 자신조차도!)

    또 JIT 컴파일러 기술이 발전하다보면 VM 언어들의 성능 문제를 생각하지 않아도 될 수 있겠죠.


    스마트폰과 같은 모바일 기기의 성능이 PC를 능가할수는 없을 것이 분명한데, 이를 최적화된 코드 생성 능력만으로 커버할 수 있을까요? 제가 보기엔 단일 기기에서의 성능이 얼마나 좋은가보다는 결국 클라우드 컴퓨팅 파워를 얼마나 편리하게, 효율적으로 활용하느냐가 중요해질 것이거든요. C++은 이런 점에선...

Leave a comment
« Previous : 1 : ... 1541 : 1542 : 1543 : 1544 : 1545 : 1546 : 1547 : 1548 : 1549 : ... 2204 : Next »

블로그 이미지

그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Site Stats

Total hits:
3049015
Today:
35
Yesterday:
2142