У меня есть рекурсивное определение шаблона (я только что придумал этот термин). Я думаю, что код объясняет это лучше.
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; </p>
у кого-нибудь когда-нибудь были проблемы с этим? И какие решения вы придумали?