У меня есть определение рекурсивного шаблона (я только что придумал этот термин). Я думаю, что код объясняет это лучше.
template<typename X>
class Domain
{
public:
X begin;
X end;
Domain(
X _begin,
X _end)
: begin(_begin)
, end(_end)
{
// ...
}
bool Contains(
const X& t) const
{
// ...
}
};
template<typename X, typename Y>
class IFunction
{
public:
Domain<X> myDomain;
public:
IFunction(
const Domain<X>& dom)
: myDomain(dom)
{
}
virtual Y
Calc(
const X& IV) const = 0;
virtual IFunction<X, Y>*
GetDerivative() const = 0;
};
template<typename X, typename Y, int n>
class NthOrderFunction
: public IFunction<X, Y>
{
public:
double coeffs[n+1];
public:
NthOrderFunction(
const Domain<X>& dom,
... )
: IFunction(dom)
{
}
virtual Y
Calc(
const X& IV) const
{
// temporary compile solution
return Y();
}
virtual IFunction<X, Y>*
GetDerivative() const
{
if ( n > 1 )
{
return new NthOrderFunction<X, Y, n-1>(dom, ...);
}
return new FlatLine<X, Y>(dom);
}
};
Я взял много наследования и других отношений, чтобы сделать его читабельным, простым и загадочным. Таким образом, при редактировании кода могла произойти новая опечатка, но, пожалуйста, не обращайте на нее внимания. Код работал отлично в течение многих лет, единственная проблема, которая у меня есть, - это та, на которую я собираюсь указать.
Недавно я добавил функцию GetDerivative, и ее реализация в классе NthOrderFunction вызывает у меня проблемы. Я знаю, что классы шаблонов определены до компиляции, но после предварительной обработки. Таким образом, я не могу понять, как заставить эту функцию работать. Каждая функция NthOrderFunction с параметром шаблона n требует NthOrderFunction с параметром шаблона n-1. Вы видите, что это проблема. Дело в том, что даже несмотря на то, что n никогда не будет отрицательным в использовании, никакое количество кода, которое я выполняю, не убедит "механизм определения шаблонов" не беспокоиться о экземплярах n <1;
у кого-нибудь когда-либо были проблемы с этим ? И какие решения вы придумали?