클래스를 특수화한다는 방법이 좀 이상합니다.

dltkddyd의 이미지

포인터를 특수화하는 경우와 포인터가 아닌 타입을 특수화하는 경우 특수화의 방식이 다른가요?
아래 코드에서 포인터를 인수로 받는 클래스와 포인터가 아닌 인수를 받는 클래스의 특수화 방식이 좀 다르던데요.

#include <iostream>
using namespace std;
 
template<typename CARGT>
class VoidTest {
public:
  CARGT mem1;
  VoidTest() {
    cout<<"Not void"<<endl;
  }
};
 
template<>
class VoidTest<void> {
public:
  VoidTest() {
    cout<<"Void"<<endl;
  }
};
 
template<typename CARGT>
class VoidTest<CARGT*> {
public:
  VoidTest() {
    cout<<"Pointer."<<endl;
  }
};
 
int main() {
  VoidTest<int> obj1;
  VoidTest<void> obj2;
  VoidTest<int*> obj3;
  VoidTest<void*> obj4;
 
  return 0;
}

template<>
class VoidTest

template
class VoidTest

ifree의 이미지

다르기 때문에 특수화를 하는 겁니다.
특수화는 일반적인 템플릿으로 처리할 수 없거나,
좀더 최적화된 방법을 쓰기 위해 하는 거죠.

그리고 위의 예에서는 void와 pointer만 특수화가 되어 있습니다.

dltkddyd의 이미지

포인터가 아닌 타입의 특수화는 아래와 같은 식이라면

template<>~

포인터 타입의 특수화는 아래와 같은 식이라고 외워야 겠네요.

template<cargt>

<> 안에 타입을 넣지 않는 경우와 넣지 말아야 될 경우로요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

klara의 이미지

전자는 특수화고 후자는 부분 특수화입니다. 포인터냐 아니냐의 차이가 아닙니다.

dltkddyd의 이미지

...

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.