LINUX.ORG.RU

запутался со специализацией шаблонного метода для шаблонного класса

 ,


0

2

Имеется что-то вроде такого шаблона:

template<int n>
struct foo_t{
	
	template<int m=n>
	int bar(){
		cout<<"call foo<"<<m<<">"<<endl;
		return m+bar<m-1>();
	};
};
И тут нужно явно специализировать вызов для bar<0>, а каким образом?

★★★★★

Ответ на: комментарий от thunar

bar специализировать невзомжно, точнее возможно, но там вроде как невозможно тогда описать общую имплементацию. Самое простое сделать как я написал выше.

Dudraug ★★★★★ ()
Ответ на: комментарий от Dudraug

Шаблонные функции по идее нельзя специализировать, но если сделать фейковй аргумент - их по идее можно перегрузить.

типа

template<int m=n>
	int bar(std::array<int, m>* unused_null){
		cout<<"call foo<"<<m<<">"<<endl;
                std::array<int, m-1>* fake_arg = nullptr;
		return m+bar(fake_arg);
	};

	int bar(std::array<int, 0>* unused_null){
            cout<<"no recursion"<<endl;
            return 0;
	};

GPFault ()
Ответ на: комментарий от GPFault

Вообще можно, но не внутри тела класса. То есть в отдельном cpp. И вроде только полную специализацию, partial нельзя, поэтому я предполчитаю делать специализации классов. Но там свои огрничения. Комитет стандартизации что-то переусложнил вопреки логики эту тему с специализациями.

Dudraug ★★★★★ ()
template<int n>
struct foo_t
{
  template<int m, typename std::enable_if<m != 0, int>::type* = nullptr>
  int bar()
  {
    return m + bar<m - 1>();
  }

  template<int m, typename std::enable_if<m == 0, int>::type* = nullptr>
  int bar()
  {
    return 0;
  }
};
Ower ()
template<int m>
int bar_impl([[maybe_unused]] int n)
{
	return m + bar_impl<m-1>(n);
}

template<>
int bar_impl<0>([[maybe_unused]] int n)
{
	return 0;
}

template <int n>
struct Foo {
	template <int m = n>
	int bar()
	{
		return bar_impl<m>(n);
	}
};

AlexVR ★★★★★ ()