Как написать специализацию метода шаблона класса?

Рейтинг: 0Ответов: 2Опубликовано: 15.05.2023
template <int N1>
class A
{  
public:
   template <int N2> int func();
};

template <int N1> template <int N2> int A<N1>::func()
{  return N1+N2;
}
    
//template <int N1> template <> int A<N1>::func<0>() //error
//{  return N1+1;
//}

int  main(void)
{  
   A<1> a;
   int x=a.func<2>();
   int y=a.func<0>();
   return 0;
}

Ответы

▲ 0

В этом случае можно обойтись без специализации.

template <int N1>
class A
{  
   public: template <int N2> int
   func()
   {
       if constexpr (0 != N2)
       {
            return N1 + N2;
       }
       else
       {
            return N1 + 1;
       }
   }
};
▲ 0

Специализация метода требует специализации класса. А внутри класса написать такую специализацию вообще не получится. Дело в том, что такая специализация требует явного указания scope'а класса (например A<int>::), но так как мы уже находимся внутри класса, то писать его scope - тоже будет ошибкой. Такая вот весьма странная ситуация получается.

#include <concepts>

template<typename CT> class A {
public:
    CT var;
    template<typename FT> int func() {
        if constexpr (std::same_as<FT,int>) {}
    }
};

template<> template<> int A<int>::func<int>() {}

Кстати, если используются TTP (а не NTTP), то возможно так будет лучше:

template<typename CT> class A {  
public:
    template<typename FT> auto func(CT a1, FT a2) {
        return a1 + a2;
    }
};

Выведение типа возвращаемого значения из выражения return.