dependent name을 사용한 멤버 템플릿 접근 시 template 키워드의 사용

Tags:

CN said, class, template, typename의 차이는 class, typename의 차이라고 해야 하지 않을까요? 에 대한 답글입니다.

보통 템플릿을 선언할때는

template<class T>
void func(T &x);

또는

template<typename T>
void func(T &x);

와 같이 혼용할 수 있으므로 선택의 기준은 class냐 typename이냐가 될 수 있다는 말씀에 동의합니다.

제가 생각한 내용은 템플릿을 쓸 때, class, typename, template 키워드가 나와야 되는 상황에서 어떻게 이 세가지를 제대로 쓰는지는 어렵다는 점이었습니다. 답글에 이중템플릿이란 용어를 쓰셨는데, 이 용어는 처음 접해봤지만 아마 저와 같은 내용을 지칭하는 것이라 생각됩니다. 답글 감사합니다 (^^)(__)

다음은 제 기억을 위해 – 그리고 이 블로그의 존재 목적을 위해 – template 에 대해 남기는 내용입니다.

template은 dependent name을 사용해 멤버 템플릿을 . 또는 :: 또는 -> 로 접근할 때 씁니다. 예를 들면,

#include <iostream>

using namespace std;

struct foo
{
    template<int U>
    int bar(int x)
    {
        return U * x;
    }
};

template<class T>
struct caller
{
    int bar(T &x)
    {
        return x.template bar<3>(2);  // Note: template is required.
    }
};

int main()
{
    caller<foo> c;
    foo f;
    cout << c.bar(f) << endl;

    return EXIT_SUCCESS;
}
&#91;/code&#93;

과 같이 어떤 타입을 T로 받고 나서 그 T의 템플릿 멤버 함수를 호출하고자 할 경우 필요합니다. 만약 template 구문이 없다면 g++에서는 다음과 같은 에러가 납니다. 앞서의 예가 좀 작위적인데 이해해 주시길.

&#91;code&#93;
test.cpp: In member function 'int caller<T>::bar(T&) [with T = foo]':
test.cpp:27:   instantiated from here
test.cpp:19: error: invalid use of member (did you forget the '&' ?)

이렇게 황당해지는 이유는 x.bar<3>(2) 이라고 적으면 이 구문이 x.bar < 3 과 3 > (2) 로 해석 될 수 있기 때문이고 이것이 C++에서 유효한 문장이기 때문입니다. 설명도 역시 formal 하지는 않은데 역시나 이해해 주시길. 전 formal 한 설명보면 C++이 점점 더 싫어지는고로;;

Comments

3 responses to “dependent name을 사용한 멤버 템플릿 접근 시 template 키워드의 사용”

  1. CN Avatar

    아 x.template bar<3>(2);와 같은 사용법을 말씀하신 거였군요.

    내가 언급한 코드는 아래와 같은 코드입니다.

    template <template <class> class CreationPolicy> class WidgeManager: public CreationPolicy<Widget>
    { //bla bla
    void SwitchProtoType(Widget* pNewPrototype)
    {
    CreationPolicy<Widget>& myPolicy = *this;
    }
    }

    와 같은 형태를 말씀하시는 줄 알았습니다. 나는 위와 같이 템플릿이 중첩된 코드를 종종 사용하는 편입니다. 조금 더 변형 된 형태를 표기해보면

    template
    <
    class T,
    template <class> class CheckingPolicy,
    template <class> class ThreadingModel
    >
    class SmartPtr
    : public CheckingPolicy<T>
    , public ThreadingModel<SmartPtr>
    {
    // bla bla
    }

    과 같은 형태가 되겠지요.

    언급하신 부분도 충분히 프로그램을 난해하게 보이게 하겠군요. (…)

    PS: 위에 글 두개를 삭제해주세요.

  2. MKSeo Avatar
    MKSeo

    읔. 이거 스마트 포인터 소스인가보죠?

    혹시 policy 이런 부분들은 Modern C++ Design 책에 나오는 건가요? (전 modern c++은 안봄) 기절하게 복잡해보이는군요;;

    p.s. 저도 cafe24 사용하는데요. 거기 1대1질문 게시판에 질문해보시면 의외로 친절하니까, CN님 블로그좀 잘 뜨게 해주세요 ㅎㅎ

  3. MKSeo Avatar
    MKSeo

    Modern C++ Design 샀습니다. 벼르고 벼르다. CN님의 코드가 이제 무슨의미인지 알겠군요 :-)

Leave a Reply

Your email address will not be published. Required fields are marked *