아래와 같이 클래스 템플릿에서 특정 멤버 함수만 특수화가 가능합니다.

mytemplateclass.h
  • cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
class mytemplateclass
{
public:
std::string get_name(); // 특수화 하려는 대상
int get_grade();

private:
std::string name_;
int grade_;
}

#include "mytemplateclass.impl.h"
mytemplateclass.impl.h
  • cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T>
std::string mytemplateclass<T>::get_name()
{
return name_;
}

template<>
std::string mytemplateclass<int>::get_name()
{
return std::string("specific member function specialization");
}

template <typename T>
int mytemplateclass<T>::get_grade()
{
return grade_;
}

C++17 부터는 if constexprstd::is_same_v를 조합하여 좀 더 깔끔하게 처리할 수 있습니다.

mytemplateclass_v2.h
  • cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
class mytemplateclass_v2
{
public:
std::string get_name(); // 특수화 하려는 대상
int get_grade();

private:
std::string name_;
int grade_;
}

#include "mytemplateclass_v2.impl.h"
mytemplateclass_v2.impl.h
  • cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename T>
std::string mytemplateclass_v2<T>::get_name()
{
if constexpr (std::is_same_v<int, T>)
{
return std::string("specific member function specialization");
}
return name_;
}

template <typename T>
int mytemplateclass_v2<T>::get_grade()
{
return grade_;
}

Reference