我有一个递归模板定义(我刚刚制定了这个术语)。我认为代码更好地解释它。递归模板定义
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的实例。
有没有人有过这个问题?你有什么解决方案?
这到底是什么B? – 2011-06-16 11:13:03
对不起,一定是X,会编辑。 – Rene 2011-06-16 11:15:46
你想使用模板元编程来处理多项式吗?我认为之前已经完成了:-) – 2011-06-16 11:22:02