c++ - 递归模板定义

标签 c++ templates recursion definition

我有一个递归模板定义(我刚刚编造了那个术语)。我认为代码可以更好地解释它。

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 类中的实现给我带来了问题。我知道模板类是在编译之前但在预处理之后定义的。因此,我看不出如何让这个功能发挥作用。每个带有模板参数 n 的 NthOrderFunction 都需要一个带有模板参数 n-1 的 NthOrderFunction。你可以看到这是一个问题。问题是,即使 n 在使用中永远不会为负数,我所做的任何编码都无法说服“模板定义引擎”不要理会 n < 1 的实例;

有人遇到过这个问题吗?您提出了哪些解决方案?

最佳答案

这个和模板元编程101 example-factorial一样,只是内容稍微复杂一些。

template<int N> struct factorial { enum { value = N * factorial<N-1>::value }; };

并且您需要相同的解决方案 - 基本案例的特化。

template<> struct factorial<1> { enum { value = 1 }; };

你的将是部分的而不是完整的,但它仍然有效。

关于c++ - 递归模板定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6370848/

相关文章:

C++链表复制和克隆函数

Mysql递归查询互连线

c++ - -Werror 是否会干扰模板正确性和/或 SFINAE?

javascript - 了解 javascript 中的事件队列和调用堆栈

powershell - 如何使用PowerShell删除目录中的所有文件和所有小于100kb的子目录

c++ - 如何使用装饰器模式直接修改基类成员?

c++ - 如何在 C++ 中初始化指向结构的指针数组?

C++ 严格弱排序派生类

c++ - 什么模式匹配(如果有)适用于 C++ 可变参数模板函数调用?

C++11 std::tuple 到 std::array 转换导致可变参数模板崩溃