Определение рекурсивного шаблона

У меня есть определение рекурсивного шаблона (я только что придумал этот термин). Я думаю, что код объясняет это лучше.

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;

у кого-нибудь когда-либо были проблемы с этим ? И какие решения вы придумали?

6
задан Rene 16 June 2011 в 11:18
поделиться